c中条件运算符中的增量运算符
我希望b是3岁。c中条件运算符中的增量运算符,c,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; } #包括 int main() { int a=0; int b=1; intc=(a++>b++)?a
这是一种未定义的行为吗? 或者结果可以预测?
但我以为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;
}
#包括
int main()
{
int a=0;
int b=1;
intc=(a++>b++)?a++:b++;
printf(“%d%d%d”,a、b、c);
返回0;
}
这就是我得到的,我同意这是肯定的。在对第一个操作数(条件)求值之后,在转到第二个或第三个操作数之前,有一个序列点。所以它是这样的:
(a++ >b++ )
评估结果为:
0 > 1
也就是0
之后,a
为1,b
为2
因为它是假的:
b++
进行了评估。结果是2(分配给c
),然后b
是3
如果这是正确的代码,那么您的编译器就是有缺陷的。这甚至不是秩序问题。即使第三个操作数在第一个操作数之前求值(这是错误的),b
仍应为3
我使用的是GCC 4.6.3,但在所有符合标准的编译器中结果都是一样的。这就是我得到的,我同意这是保证的。在对第一个操作数(条件)求值之后,在转到第二个或第三个操作数之前,有一个序列点。所以它是这样的:
(a++ >b++ )
评估结果为:
0 > 1
也就是0
之后,a
为1,b
为2
因为它是假的:
b++
进行了评估。结果是2(分配给c
),然后b
是3
如果这是正确的代码,那么您的编译器就是有缺陷的。这甚至不是秩序问题。即使第三个操作数在第一个操作数之前求值(这是错误的),b
仍应为3
我使用的是GCC 4.6.3,但在所有符合标准的编译器中结果都是一样的。这是定义的行为,在
的第一个操作数和第二个或第三个操作数之间有一个序列点:
因此,在计算a++之后,a=1和b=2。然后选择第三个操作数。因此,c被赋值为b++
。所以c=2,然后b=3
C11标准规定:
6.5.15条件运算符
计算第一个操作数;在其之间有一个序列点
求值和第二个或第三个操作数的求值
(以评估值为准)
这是定义的行为,在
?:
的第一个操作数和第二个或第三个操作数之间有一个序列点
因此,在计算a++之后,a=1和b=2。然后选择第三个操作数。因此,c被赋值为b++
。所以c=2,然后b=3
C11标准规定:
6.5.15条件运算符
计算第一个操作数;在其之间有一个序列点
求值和第二个或第三个操作数的求值
(以评估值为准)
b是3,c是2。。您使用了什么编译器?@Weston pelles c.i获得了1 2 1作为输出。请尽快卸载该编译器!b是3,c是2。。您使用了什么编译器?@Weston pelles c.i获得了1 2 1作为输出。请尽快卸载该编译器@嗯,是的,从问题上看很清楚。这意味着您的编译器坏了。@cdummy是的,问题已经清楚了。这意味着你的编译器坏了。