条件算子在算术运算中的行为

时间:2019-01-15 16:45:25

标签: c gcc

这个问题是关于条件运算符如何在算术运算和赋值语句中工作的。

在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!

一旦算术语句遇到条件运算,它将忽略语句的左部分。 (我认为条件操作之后按执行顺序执行的任何操作都将被忽略)

此外,我们可以使用圆括号()或最左侧进行条件运算来缓解这种情况。 谁能解释这种行为?在算术语句中使用条件运算是否会引入未定义的行为问题?

也感到惊讶,这是以前没有被问到的。如果是,请提供链接。 非常感谢!

2 个答案:

答案 0 :(得分:3)

t2的值取决于模量%,加法+和三元?:运算符的优先级。

您可以通过点击this链接找到C运算符优先级的完整列表。

在您的情况下,模运算符的优先级最高,其次是加法运算,然后是三进制运算符。

答案 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


这是所有操作顺序;就像*/优先于+-一样,所有运算符都有优先级。