为什么编译器会给我一个警告,即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
}
答案 0 :(得分:1)
编译器让OP知道序列k = k++;
未由C定义。
某些编译器可能会增加k
,然后将预增量值分配给k
- 从而覆盖增量。另一个编译器可以执行增量,但尚未保存结果,将预增量值分配给k
本身,然后将增量值保存到k
。
总而言之,执行a = k++ / ++k;
之类的代码会产生问题。编译器可以自由地首先评估除法的左侧或右侧,未定义序列,并获得不同的答案。
改为使用:
k++;
或
++k;
或
k = k + 1;
答案 1 :(得分:1)
请参阅此链接Undefined Behavior and Sequence Points
k = k++; // k is modified more than once