我预计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;
}
答案 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条件运算符
评估第一个操作数;它之间有一个序列点 评估和评估第二或第三操作数 (以评估为准)。