3 回答
TA贡献1829条经验 获得超13个赞
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));
TA贡献1880条经验 获得超4个赞
实际的主要区别在于,在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;
TA贡献1752条经验 获得超4个赞
C解析的部分不正确。在C语法中,=
运算符的LHS 不能包含非括号?:
运算符。建议的(a ? b : c) = d
解析实际上是不可能的。在C语言中,语法a ? b : c = d
表达根本无法解析。任何解释它的编译器都会(a ? b : c) = d
自担风险。(在试图统一C和C ++语法的混合C / C ++编译器中,通常是这种情况。)形式上,这没有问题,因为仍然会拒绝无效代码。但是,“不是左值”消息具有误导性。
- 3 回答
- 0 关注
- 559 浏览
添加回答
举报