关于int的未定义增量的警告

Ken*_*eth 1 c avr-gcc

我对avr-gcc有一个奇怪的问题.如果我这样做:

int i = 0;
i = ++i;
Run Code Online (Sandbox Code Playgroud)

它导致编译器警告:

warning: operation on ‘i’ may be undefined
Run Code Online (Sandbox Code Playgroud)

这有什么不对?

如果它被重写为

i = i + 1;
Run Code Online (Sandbox Code Playgroud)

它不会导致警告.

avr-gcc是版本4.3.4,我在Ubuntu 10.04上运行它.

Gre*_*ill 8

如果您打算简单地增加i,那么使用其中之一

i = i + 1;
Run Code Online (Sandbox Code Playgroud)

要么

++i;
Run Code Online (Sandbox Code Playgroud)

(或i++),但不是两者.C的规则不允许您在单个序列点之前修改变量两次.preincrement(++i)和赋值(i =)都修改了值i.

  • @Kenneth:你得到了警告,因为*'*++ i`和`i =`都试图修改`i`的值.编译器可以自由地生成以任何顺序执行此操作的代码,因此以"i"结尾的值是未定义的.(请注意,preincrement运算符仅表示在表达式中使用之前递增值,而不是在使用之前将递增的值*存储*返回到`i`). (2认同)