为什么编译器会警告我对 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
}
编译器让 OP 知道该序列k = k++;
不是由 C 定义的。
一些编译器可能会递增k
,然后将预递增值分配给k
- 从而覆盖增量。另一个编译器可能会进行增量,但尚未保存结果,将预增量值分配给k
, 本身,然后将增量值保存到k
.
总而言之,执行类似a = k++ / ++k;
或类似的代码会产生问题。编译器可以先评估除法的左侧或右侧,序列未定义,您会得到不同的答案。
而是使用:
k++;
或者
++k;
或者
k = k + 1;
请参阅此链接未定义的行为和序列点
k = k++; // k is modified more than once