C和C ++之间的条件运算符差异

我在某处读到?:,C 中的运算符在C ++中略有不同,有些源代码在两种语言中的工作方式有所不同。不幸的是,我在任何地方都找不到文字。有谁知道这是什么区别?



慕码人8056858
浏览 536回答 3
3回答

烙印99

C ++中的条件运算符可以返回左值,而C不允许类似的功能。因此,以下内容在C ++中是合法的:(true ? a : b) = 1;要在C中复制此代码,您将不得不诉诸if / else或直接处理引用:*(true ? &a : &b) = 1;此外,在C ++,?:和=运营商有相同的优先级和组从右到左,使得:(true ? a = 1 : b = 2);是有效的C ++代码,但会在C中抛出一个错误,并且在最后一个表达式周围没有括号:(true ? a = 1 : (b = 2));

慕村225694

实际的主要区别在于,在C中,对?:的求值永远不会像在C ++中那样导致l值。它的定义还有其他差异,几乎没有实际意义。在C ++中,第一个操作数转换为布尔值,在C中,它与0进行比较。这类似于C和C ++之间的==,!=等定义上的差异。C ++中还存在更复杂的规则,用于根据第二和第三操作数的类型推导?:表达式的类型。这反映了C ++中用户定义的隐式转换的可能性。示例代码。有效的C ++; 无效的C.extern int h(int p, int q);int g(int x){        int a = 3, b = 5;        (x ? a : b) = 7;        return h( a, b );}gcc 生成为C时会生成错误:“错误:赋值中的无效左值”,但编译为C ++时,代码将正确编译。编辑: 尽管?:不能在C中返回l值,也许令人惊讶的是?:的语法是:conditional-expression:    logical-OR-expression    logical-OR-expression ? expression : conditional-expression这意味着即使(由于“不是l值”规则)a ? b : c = d解析(a ? b : c) = d也不会导致有效的表达式。C ++将语法更改为此:conditional-expression:    logical-or-expression    logical-or-expression ? expression : assignment-expression尽管在某些情况下允许条件表达式为l值的扩展名在a ? b : c = d没有语法更改的情况下就有效,但新的语法更改意味着表达式现在有效,但含义不同a ? b : (c = d)。尽管我没有任何证据,但是我认为随着语法的变化不会破坏与现有C代码的兼容性,因此新语法更有可能使诸如以下的表达式产生更少的惊喜:make_zero ? z = 0 : z = 1;

温温酱

C解析的部分不正确。在C语法中,=运算符的LHS 不能包含非括号?:运算符。建议的(a ? b : c) = d解析实际上是不可能的。在C语言中,语法a ? b : c = d表达根本无法解析。任何解释它的编译器都会(a ? b : c) = d自担风险。(在试图统一C和C ++语法的混合C / C ++编译器中,通常是这种情况。)形式上,这没有问题,因为仍然会拒绝无效代码。但是,“不是左值”消息具有误导性。
打开App,查看更多内容
随时随地看视频慕课网APP