小编chq*_*lie的帖子

迭代for循环中的所有无符号整数

假设我想在循环中迭代所有整数for.为了便于讨论,假设我f(unsigned x)为每个整数调用一些未知函数:

for (unsigned i = 0; i < UINT_MAX; i++) {
     f(i);
}
Run Code Online (Sandbox Code Playgroud)

当然,上面的代码无法遍历所有整数,因为它错过了一个:UINT_MAX.将条件更改为i <= UINT_MAX仅导致无限循环,因为这是一个重言式.

你可以用do-while循环来完成它,但是你会失去for语法的所有细节.

我可以吃蛋糕(for循环)并吃掉它(迭代所有整数)吗?

c syntax loops for-loop

10
推荐指数
2
解决办法
715
查看次数

设置为 CHAR_MAX 的字符值是否保证环绕到 CHAR_MIN?

我的代码:

#include <stdio.h>
#include <limits.h>

int main()
{
    char c = CHAR_MAX;
    c += 1;
    printf("CHAR_MIN=%d CHAR_MAX=%d c=%d (%c)\n", CHAR_MIN, CHAR_MAX, c, c);
}
Run Code Online (Sandbox Code Playgroud)

输出:

CHAR_MIN=-128 CHAR_MAX=127 c=-128 ()
Run Code Online (Sandbox Code Playgroud)

我们看到,当我们增加一个char设置为的变量时CHAR_MAX,它会环绕到CHAR_MIN。这种行为有保证吗?或者它将是未定义的行为或实现指定的行为?C99 标准对此有何评论?

[注意:将大于 CHAR_MAX (127) 的值赋予 charC会发生什么-为什么 char c=129 会转换为 -127?没有解决这个问题,因为他们谈论分配一个超出范围的值而不是将一个值增加到一个超出范围的值。]

c standards integer-overflow char language-lawyer

10
推荐指数
1
解决办法
612
查看次数

变量参数列表和空指针

请考虑以下代码:

#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>

void foo(const char *arg, ...) {
    va_list args_list;

    va_start(args_list, arg);

    for (const char *str = arg;
         str != NULL;
         str = va_arg(args_list, const char *)) {
        printf("%s\n", str);
    }

    va_end(args_list);
}

int main(int argc, char **argv) {
    foo("Some", "arguments", "for", "foo", NULL);
    foo("Some", "arguments", "for", "foo", 0);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我们可以看到,foo()使用变量参数列表来获取字符串列表然后将它们全部打印出来.假设最后一个参数是空指针,因此处理参数列表直到NULL被检测到.

函数以两种不同的方式foo()调用main(),使用NULL0作为最后一个参数.

我的问题是:第二次调用0是否正确?

我想,我们不应该叫foo()0.原因是在这种情况下,例如,编译器无法从上下文中猜测0 …

c pointers

9
推荐指数
2
解决办法
1161
查看次数

找到可分性的有效方法

教授说这不是一个有效的算法来检查这个数字是否可以被100,000-150,000的数字整除.我找不到更好的方法.任何帮助,将不胜感激.

unsigned short divisibility_check(unsigned long n) {
    unsigned long i;
    for (i = 100000; i <= 150000; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

c algorithm performance

9
推荐指数
2
解决办法
553
查看次数

为什么 ++(*p) 改变指针值?

如果我有这个代码:

int A[5] = { 2, 1, 3, 55 };
int *p = A;
cout << ++(*p);
Run Code Online (Sandbox Code Playgroud)

结果是3并且第一个位置的A3也是,为什么?

我的意思是,运算符()的层次结构比 层次结构更高++,那么我们首先需要操作*p

++(*p) => ++(2) => 3 
Run Code Online (Sandbox Code Playgroud)

A矢量有任何变化吗?

c c++ pointers

9
推荐指数
2
解决办法
261
查看次数

scanf跳过

我正在尝试为一个类创建一个简单的C程序,其中一个要求是我需要使用scanf/ printf用于所有输入和输出.我的问题是为什么我scanf跳过主循环中的for循环并且程序刚终止.

这是我的代码

#include <stdio.h>

void main() {
    int userValue;
    int x;
    char c;

    printf("Enter a number : ");
    scanf("%d", &userValue);
    printf("The odd prime values are:\n");
    for (x = 3; x <= userValue; x = x + 2) {
        int a;
        a = isPrime(x);
        if (a = 1) { 
            printf("%d is an odd prime\n", x);
        }
    }   
    printf("hit anything to terminate...");
    scanf("%c", &c);    
}

int isPrime(int number) {
    int i;
    for (i = 2; i …
Run Code Online (Sandbox Code Playgroud)

c scanf

8
推荐指数
1
解决办法
1万
查看次数

typedef'ng指针和const

我正在看一个例子,它表明为什么typedef'ng指针是一种不好的做法.我对该示例不了解的部分是为什么编译器无法捕获问题.我在下面的代码中详细说明了这个例子:

#include <stdio.h>

typedef int *TYPE; 

void set_type(TYPE t) {
    *t = 12;
}

void foo(const TYPE mytype) {   
    set_type(mytype);  // Error expected, but in fact compiles 
}

int main() {   
    TYPE a;
    int b = 10;
    a = &b;
    printf("A is %d\n",*a);
    foo(a);
    printf("A is %d\n",*a);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以,我能够改变它的价值a.即使这个例子解释了你必须要typedef const int *TYPE解决这个问题,我也不明白为什么编译器在设置TYPE to be const函数参数本身时无法捕获错误.我确信我遗漏了一些非常基本的东西.

c pointers typedef const

8
推荐指数
1
解决办法
341
查看次数

为什么fopen在没有保存返回指针的情况下工作?

我写了一个小程序来解密一个OTP加密的文件.这很好用.

但是我意识到在"Solution.jpg"上调用fopen时我忘了保存返回的文件指针.如您所见,我正在写入文件指针f.我想知道为什么这个代码工作.

#include <stdio.h>

#define FILE_SIZE 4202

int main () {
    unsigned char key[FILE_SIZE], otpCipher[FILE_SIZE];

    FILE *f = fopen("otpkey.bin", "r");
    fread(key, sizeof(char), FILE_SIZE, f);
    fclose(f);

    f = fopen("otpcipher.bin", "r");
    fread(otpCipher, sizeof(char), FILE_SIZE, f);
    fclose(f);

    fopen("Solution.jpg", "w");

    for (int j = 0; j < FILE_SIZE; ++j) {
        otpCipher[j] = otpCipher[j] ^ key[j];
        fputc(otpCipher[j], f);
    }

    fclose(f);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c fopen pointers

8
推荐指数
1
解决办法
98
查看次数

通常的做法是"滥用"循环作为goto

如果在代码中有许多if子句并且代码的执行在先前的错误中是不明智的,那么使用单周期循环是否可以?只是为了能够休息时退出街区?像这样:

do {
    //..code
    if (error1) break;
    //..code
    if (errorN) break;
    //do finally something when no errors before
} while (false);
Run Code Online (Sandbox Code Playgroud)

c c++ coding-style

8
推荐指数
1
解决办法
305
查看次数

有没有办法让这个功能更快?(C)

我在 C 中有一个代码,它以与人类相同的方式进行加法,因此,例如,如果我有两个数组A[0..n-1]and B[0..n-1],则该方法将执行C[0]=A[0]+B[0]C[1]=A[1]+B[1]...

我需要帮助使这个函数更快,即使解决方案使用的是内在函数。

我的主要问题是我有一个非常大的依赖问题,因为迭代i+1取决于迭代的进位i,只要我使用基数 10。所以如果A[0]=6B[0]=5C[0]必须是1并且我有1下一个加法的进位。

我能做的更快的代码是这样的:

void LongNumAddition1(unsigned char *Vin1, unsigned char *Vin2,
                      unsigned char *Vout, unsigned N) {
    for (int i = 0; i < N; i++) {
        Vout[i] = Vin1[i] + Vin2[i];
    } 

    unsigned char carry = 0;

    for (int i = 0; i < N; i++) {
        Vout[i] += carry;
        carry = Vout[i] / …
Run Code Online (Sandbox Code Playgroud)

c arrays optimization performance add

8
推荐指数
1
解决办法
394
查看次数