为什么k上的操作可能未定义?

时间:2013-10-14 23:59:56

标签: c undefined operation

为什么编译器会给我一个警告,即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
}

2 个答案:

答案 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