i=i+++++;Ci=++;i+;c++;;

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表示增量,然后计算表达式。 在您的示例中,我看到您设

我不知道这是否是特定于编译器的,但当我尝试在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=++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:不,在表达式中使用变量值后,可以随时执行后增量。未定义是在分配之前还是之后执行。