c中条件运算符内的递增运算符

时间:2012-03-25 09:09:41

标签: c

我预计b为3.
这是一个未定义的行为? 或结果可以预测?
但我认为b会是3 和c将是2。 我得到的输出是1 2 1
请解释

#include<stdio.h>
int main()
{
int a = 0;
int b = 1;
int c = (a++ >b++ )? a++ : b++;
printf("%d %d %d",a,b,c);
return 0;
}

2 个答案:

答案 0 :(得分:4)

这就是我得到的,我同意保证这一点。在转到第二个或第三个操作数之前,在评估第一个操作数(条件)之后有一个序列点。所以它是这样的:

(a++ >b++ )

评估为:

0 > 1

是0。

之后,a为1,b为2。

因为它是假的:

b++ 
评估

。结果为2(分配给c),之后b为3。

如果这是确切的代码,那么你的编译器就是错误的。这甚至不是订单问题。即使第三个操作数在第一个操作数之前进行了评估(这可能是错误的),b仍应为3。

我使用的是GCC 4.6.3,但结果在所有符合标准的编译器中都是一样的。

答案 1 :(得分:2)

它是定义的行为,?:的第一个操作数与第二个或第三个操作数之间有一个序列点。

因此在评估a++ < b++之后,a = 1且b = 2.然后第三个操作数被选中。因此c被分配b++。所以c = 2且然后 b = 3.

C11标准说:

  

6.5.15条件运算符

     

评估第一个操作数;它之间有一个序列点   评估和评估第二或第三操作数   (以评估为准)。