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

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

C ++中的条件运算符可以返回一个左值,而C不允许类似的function。 因此,以下在C ++中是合法的:

 (true ? a : b) = 1; 

要在C中复制这个,你必须求助于if / else,或直接处理引用:

 *(true ? &a : &b) = 1; 

同样在C ++中, ?:=运算符具有相同的优先级,并从右到左分组 ,因此:

 (true ? a = 1 : b = 2); 

是有效的C ++代码,但是会在最后一个expression式的括号内在C中抛出一个错误:

 (true ? a = 1 : (b = 2)); 

主要的实际区别是在C语言中,对?的评估永远不会像在C ++中那样产生一个l值。

它的定义还有其他的区别,几乎没有什么实际的后果。 在C ++中,第一个操作数被转换为bool,在C中与0进行比较。这与C和C ++之间==,!=等的定义不同。

C ++中还有更复杂的规则来根据第二个和第三个操作数的types推导出一个?:expression式的types。 这反映了在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 ); } 

编译为C时, gcc生成错误:“错误:在赋值中无效的左值”,但编译为C ++时,代码无错地编译。

编辑:虽然?:不能在C中返回一个l值,可能令人惊讶的是:?的语法是:

 conditional-expression: logical-OR-expression logical-OR-expression ? expression : conditional-expression 

这意味着a ? b : c = d a ? b : c = dparsing为(a ? b : c) = d即使(由于'不是l值'规则),这不会导致有效的expression式。

C ++将语法更改为:

 conditional-expression: logical-or-expression logical-or-expression ? expression : assignment-expression 

尽pipe在某些情况下允许条件expression式是一个l值的扩展将会使得 a ? b : c = d有效,没有语法变化,新的语法变化意味着expression式现在是有效的,但是具有不同的含义a ? b : (c = d) a ? b : (c = d)

虽然我没有任何证据,但是我的假设是,由于语法的变化不能破坏与现有C代码的兼容性,所以新的语法更可能产生更less的意外,例如:

 make_zero ? z = 0 : z = 1;