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

C 关于int上未定义增量的警告,c,avr-gcc,C,Avr Gcc,我对avr gcc有一个奇怪的问题。如果我这样做: int i = 0; i = ++i; 它会导致编译器警告: warning: operation on ‘i’ may be undefined 这里怎么了 如果它被重写为 i = i + 1; 它不会导致警告 avr gcc是4.3.4版,我在Ubuntu 10.04上运行它。如果你想简单地增加I,那么使用 或 (或i++),但不是两者都有。C的规则不允许在单个序列点之前修改变量两次。如果要简单地增加i,则预增量(++i)和赋值(i=

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

int i = 0;
i = ++i;
它会导致编译器警告:

warning: operation on ‘i’ may be undefined
这里怎么了

如果它被重写为

i = i + 1;
它不会导致警告


avr gcc是4.3.4版,我在Ubuntu 10.04上运行它。

如果你想简单地增加
I
,那么使用


(或
i++
),但不是两者都有。C的规则不允许在单个序列点之前修改变量两次。如果要简单地增加
i
,则预增量(
++i
)和赋值(
i=
)都会修改
i

的值,然后使用


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

的值。我想知道您为什么认为这是一个奇怪的问题。你这样写代码的理由是什么?另外,您不需要将初始值赋给i,这是对不同代码段的简化。原始行为:pos=++pos&0xf;然而,问题只涉及前缀运算符。我的错误。如果变量被初始化,结果是一样的。
&
不会引入序列点。我想知道为什么您认为这是一个奇怪的问题。你这样写代码的理由是什么?另外,您不需要将初始值赋给i,这是对不同代码段的简化。原始行为:pos=++pos&0xf;然而,问题只涉及前缀运算符。我的错误。如果初始化变量,则结果相同。
&
不会引入序列点。这!还应该提到:“未定义的行为”。这正是编译器告诉我们的。所以我得到这个警告是因为++I直接对变量进行操作,而I+1对中间变量进行操作,对吗?@Kenneth:你得到这个警告是因为
++I
I=
都试图修改
I
的值。编译器可以自由地生成以任何顺序执行此操作的代码,因此在
i
中结束的值是未定义的。(请注意,preincrement运算符只表示在表达式中使用之前该值是递增的,而不是在使用之前将递增的值存储回
i
。@Greg:谢谢。这很有帮助,这个!还应该提到:“未定义的行为”。这正是编译器告诉我们的。所以我得到这个警告是因为++I直接对变量进行操作,而I+1对中间变量进行操作,对吗?@Kenneth:你得到这个警告是因为
++I
I=
都试图修改
I
的值。编译器可以自由地生成以任何顺序执行此操作的代码,因此在
i
中结束的值是未定义的。(请注意,preincrement运算符只表示在表达式中使用之前该值是递增的,而不是在使用之前将递增的值存储回
i
。@Greg:谢谢。这很有帮助。
i = i + 1;
++i;