1

为什么编译器会警告我对 k 的操作可能未定义?我该怎么做才能删除此警告?

int main(void){
    int k=0;
    int a,b;
    do{
       k = k++;
       printf("The value of k is: %d\n",k);
    }while(some condition that does not involve k);
return EXIT_SUCCESS
}
4

2 回答 2

1

编译器让 OP 知道该序列k = k++;不是由 C 定义的。

一些编译器可能会递增k,然后将预递增值分配给k- 从而覆盖增量。另一个编译器可能会进行增量,但尚未保存结果,将预增量值分配给k, 本身,然后将增量值保存到k.

总而言之,执行类似a = k++ / ++k;或类似的代码会产生问题。编译器可以先评估除法的左侧或右侧,序列未定义,您会得到不同的答案。

而是使用:

k++;

或者

++k;

或者

k = k + 1;
于 2013-10-15T00:06:55.873 回答
1

请参阅此链接未定义的行为和序列点

k = k++; // k is modified more than once
于 2013-10-15T00:22:05.410 回答