Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c中条件运算符中的增量运算符_C - Fatal编程技术网

c中条件运算符中的增量运算符

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岁。
这是一种未定义的行为吗? 或者结果可以预测?
但我以为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是的,问题已经清楚了。这意味着你的编译器坏了。