【问题标题】:Ternary operator in C vs C++ [duplicate]C与C ++中的三元运算符[重复]
【发布时间】:2015-04-04 21:36:23
【问题描述】:

C 和 C++ 之间有很多不同之处,最终停留在其中之一上 相同的代码在 C 中给出错误,而在 C++ 中执行得很好 请说明原因

int main(void)
{
   int a=10,b;
   a>=5?b=100:b=200;
}

上面的代码在 C 中给出了一个错误,说明 lvalue 需要,而相同的代码在 C++

中编译得很好

【问题讨论】:

  • 哇,现在这个问题几乎是完全重复的,不仅仅是可能的。即使投票非常相似,所有问题也几乎相同! (Wooho 得到 -3 不错)

标签: c++ c ternary-operator conditional-operator


【解决方案1】:

看看运算符的优先级。

如果没有明确的(),您的代码的行为就像

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

?: 表达式的结果不是可修改的左值 [#],因此我们不能分配任何值给它。

另外,值得一提的是,根据c 语法规则,

赋值永远不允许出现在条件运算符的右侧

相关参考:C precedence table.

OTOH,如果是c++,那么,

条件运算符的优先级与赋值相同。

并且从右到左分组,本质上使您的代码表现得像

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

所以,您的代码在 c++ 的情况下可以正常工作


[ # ] -- 根据第 6.5.15 章,脚注 (12),C99 标准,

条件表达式不会产生左值。

【讨论】:

    【解决方案2】:

    因为 C 和 C++ 不是同一种语言,并且您忽略了三元隐含的赋值。我想你想要

    b = a>=5?100:200;
    

    应该在 C 和 C++ 中都可以使用。

    【讨论】:

      【解决方案3】:

      在 C 中,您可以通过将表达式放在括号内来修复它,以便在评估赋值时变得有效。

      int main(void)
      {
         int a=10,b;
         a>=5?(b=100):(b=200);
      }
      

      错误是因为您不关心运算符优先级和评估顺序。

      【讨论】:

        猜你喜欢
        • 2012-07-23
        • 2012-08-15
        • 1970-01-01
        • 2013-08-13
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 2018-09-26
        • 2011-02-15
        相关资源
        最近更新 更多