c - 在 c 中使用三元运算符的错误

标签 c gcc operator-precedence conditional-operator turbo-c

我有一段 C 代码如下:

main()
{
    int a=10, b;
    a>=5 ? b=100 : b=200 ;
    printf("%d" , b);
}

在 unix 中的 gcc 编译器上运行代码会生成编译时错误,如下所示 “需要左值作为赋值的左操作数”并将错误指向 b = 200,而在 Windows 中使用 Turbo C 编译时输出 200。

谁能解释一下这种情况到底发生了什么?

最佳答案

在 C 中,三元运算符定义如下

逻辑或表达式 ?表达式:条件表达式

条件表达式的定义如下

logical-OR-expression

赋值运算符的优先级低于 OR 运算符。因此你必须写

a >= 5 ? b = 100 : ( b = 200 );

否则编译器认为这样的表达式

( a >= 5 ? b = 100 :  b ) = 200;

由于 C 中三元运算符的结果不是左值,因此上述表达式无效,编译器发出错误。

来自 C 标准:

the result is the value of the second or third operand (whichever is evaluated), converted to the type described below

和脚注:

110) A conditional expression does not yield an lvalue.

请注意,C 和 C++ 中的运算符定义之间存在本质区别。在 C++ 中它被定义为

逻辑或表达式?表达式:赋值表达式

在 C++ 中,相同的 GCC 成功编译了代码

#include <iostream>

int main() 
{
    int a = 10, b;

    a >= 5 ? b = 100 : b = 200;

    std::cout << "b = " << b << std::endl;

    return 0;
}

关于c - 在 c 中使用三元运算符的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26448611/

相关文章:

c - 在 C 中使用 qsort/casting

c - GCC __attribute__((mode(XX)) 实际上做了什么?

c - 很难理解消费者生产者问题中的一个问题

c++ - noexcept 依赖于成员函数的 noexcept

c - 如何在 C 软件中定义崩溃点

c - 有什么方法可以强制编译器不从缓存中删除任意变量吗?

linux - 在 GDB 中使用 ptype 显示所有 C++ 数据字段(甚至是继承的)

javascript - JavaScript 中包含两个赋值运算符的复合表达式的求值过程

javascript - 三元运算符对变量的赋值优先级

haskell - f x 的优先级和结合性是多少? haskell