i=i+++++;Ci=++;i+;c++;;
我不知道这是否是特定于编译器的,但当我尝试在DevC++ 当i=i+++++;Ci=++;i+;c++;;,c,increment,C,Increment,我不知道这是否是特定于编译器的,但当我尝试在DevC++ 当i=c=b=0时i=i+++++c给出了2而i=+++i+c++给出了1 但是 b=i+++++++c和 b=++i+++c为两个表达式生成结果1 我确实知道,根据C标准规范,在同一个表达式中对一个变量进行两次递增会导致一个未定义的值,但我很好奇编译器是如何生成这些输出的。有人能解释一下原因吗?i++和++i是完全不同的,i++是后增量,这意味着在表达式中计算i,然后在计算后增量++i表示增量,然后计算表达式。 在您的示例中,我看到您设
i=c=b=0时
i=i+++++c
给出了2
而i=+++i+c++
给出了1
但是
b=i+++++++c
和
b=++i+++c
为两个表达式生成结果1
我确实知道,根据C标准规范,在同一个表达式中对一个变量进行两次递增会导致一个未定义的值,但我很好奇编译器是如何生成这些输出的。有人能解释一下原因吗?
i++
和++i
是完全不同的,i++
是后增量,这意味着在表达式中计算i
,然后在计算后增量++i
表示增量,然后计算表达式。
在您的示例中,我看到您设置了
I=++I/I++
,这是注释中提到的未定义行为。I+++++c
,c
递增(至1),然后0+1
存储在I
中,最后I
递增,得到2
++i+c++
,i
递增(至1),然后1+0
存储在i
中,然后c
递增
这就是我如何理解编译器所做的,但正如其他人所说,不要指望其他地方会有这种行为。你确定b=++I++c=1吗?或者是B= ++I+C++?这是我对你问题的解释
i = i++ + ++c
(i = 0 + 1)++
i = 2
c = 1
i = ++i + c++
(i = 1 + 0)
i = 1
c = 1
C99标准明确规定(6.5,p2) 在上一个序列点和下一个序列点之间,对象的存储值最多应通过表达式的计算修改一次
表达式
i=++i代码>和i=i++代码>两个更新i
两次,这是不允许的。未定义的行为。事实上,如果您没有将结果分配回i
,这个问题会很有趣,这会导致未定义的行为。@Fred Larson在第二个示例中他没有,这是有效的,但第一个与您一样未定义mentioned@Jesus:我在两者中都看到分配返回到I
,因此两者都是未定义的行为。赋值和增量之间没有序列点。有一个序列点他说b=i+++++++c,这个序列点和它旁边的序列点一样有效。@grok12:不,在表达式中使用变量值后,可以随时执行后增量。未定义是在分配之前还是之后执行。