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 = d
parsing为(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;