这个问题是关于条件运算符如何在算术运算和赋值语句中工作的。
在gcc,arm-gcc上进行了测试。
//gcc 5.4.0
#include <stdio.h>
int main(void)
{
printf("Hello, world!\n");
int temp=70;
int t2=temp%100 + temp>99?2000:1900;
printf("t2=%d",t2);
return 0;
}
//This code returns answer 2000.
//gcc 5.4.0
#include <stdio.h>
int main(void)
{
printf("Hello, world!\n");
int temp=70;
int t2=temp%100 + (temp>99?2000:1900);
printf("t2=%d",t2);
return 0;
}
//This code returns answer 1970.
//gcc 5.4.0
#include <stdio.h>
int main(void)
{
printf("Hello, world!\n");
int temp=70;
int t2= temp>99?2000:1900 +temp%100;
printf("t2=%d",t2);
return 0;
}
// Answer is 1970
//gcc 5.4.0
#include <stdio.h>
int main(void)
{
printf("Hello, world!\n");
int temp=70;
int t2= 5+ temp>99?2000:1900 +temp%100;
printf("t2=%d",t2);
return 0;
}
// Answer is, 1970!
一旦算术语句遇到条件运算,它将忽略语句的左部分。 (我认为条件操作之后按执行顺序执行的任何操作都将被忽略)
此外,我们可以使用圆括号()或最左侧进行条件运算来缓解这种情况。 谁能解释这种行为?在算术语句中使用条件运算是否会引入未定义的行为问题?
也感到惊讶,这是以前没有被问到的。如果是,请提供链接。 非常感谢!
答案 0 :(得分:3)
答案 1 :(得分:2)
情况1:为清楚起见,int t2=temp%100 + temp>99?2000:1900;
被重写为:int t2=(temp%100 + temp)>99 ? 2000 : 1900;
该表达式:temp%100 + temp
为140,大于99,因此该表达式的值为2000
。
情况2:int t2=temp%100 + (temp>99?2000:1900);
temp
不大于99
,因此表达式为1900
,并添加到temp%100
中,得到1970
情况3:int t2= temp>99?2000:1900 +temp%100;
temp
不大于99
,因此表达式为1900+70
,结果为1970
这是所有操作顺序;就像*
和/
优先于+
和-
一样,所有运算符都有优先级。