首页 > 解决方案 > 条件运算符在算术运算中的行为

问题描述

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

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

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

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

也很惊讶以前没有问过这个问题。如果是,请提供链接。非常感谢!

标签: cgcc

解决方案


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

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

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


推荐阅读