为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++ C
慕码人8056858 2019-11-15 10:50:59
我在某处读到?:,C 中的运算符在C ++中略有不同,有些源代码在两种语言中的工作方式有所不同。不幸的是,我在任何地方都找不到文字。有谁知道这是什么区别?
查看完整描述

3 回答

?
烙印99

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));


查看完整回答
反对 回复 2019-11-15
?
慕村225694

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;


查看完整回答
反对 回复 2019-11-15
?
温温酱

TA贡献1752条经验 获得超4个赞

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

查看完整回答
反对 回复 2019-11-15
  • 3 回答
  • 0 关注
  • 532 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信