【问题标题】:ternary operator and assignment operator三元运算符和赋值运算符
【发布时间】:2013-06-28 16:39:33
【问题描述】:

Does the C/C++ ternary operator actually have the same precedence as assignment operators?

Luchian Grigore 的回答说像

a ? b : c = d

总是会被推断为

a ? b : ( c = d )

因为 = 和 ?: 从右到左关联所以

在 C++ 中

k =  21 > 3 ? j = 12 : j = 10;

k = 1 > 3 ? j = 12 : j = 10;

两者都很好。

在 C 中

k = 21 > 3 ? 12 : j = 10

返回错误

invalid lvalue in assignment.

不应将以上推断为(并且不返回错误)

k=  21 > 3 ? 12 : ( j = 10 )

我假设现在它被分组为

k = ( 21 > 3 ? 12 : j ) = 10

给出错误,因为在 C(不是在 C++ 中)三元运算符不能返回左值。 谁能告诉我在这种情况下如何对运算符进行分组。

【问题讨论】:

  • 我会尽量避免这种好奇心,只写 if (1 > 3) k = j = 12 else k = j = 10
  • a ? b : c = d 在 C 和 C++ 中不同!一个是a ? b : (c = d),另一个是(a ? b : c) = d
  • 我认为它实际上被处理为k=(21>3?12:j=10)
  • 这种情况的经验法则是“除非一目了然,毫无疑问,否则使用 () 或单独的子表达式”。由于 C 和 C++ 规则的不同,这在这里更适用。 ?: 中的原始作业不应该通过审核
  • 我永远不会使用这样的代码,这只是为了了解事情是如何工作的。

标签: c++ c assignment-operator conditional-operator associativity


【解决方案1】:

@hvd 对您的链接问题 (Does the C/C++ ternary operator actually have the same precedence as assignment operators?) 的回答显示了答案。

?: 的 C++ 和 C 语法不同。

在 C++ 中,最右边的操作数可以是赋值表达式(因此编译器 [贪婪地] 将 = 视为 ?: 的一部分),而在 C 中,最右边的操作数是 conditional-expression。因此,在 C 中,只要编译器命中 =?: 的分析就完成了,并将其视为 k = ( 21 > 3 ? 12 : j ) = 10

【讨论】:

  • 而且由于 12 不是左值,当您尝试编译 12 = 10 时会出现编译器错误。
  • @Lundin 我认为它是关于 (21 > 3 ? 12 : j) 不是左值,所以通过用 j 替换 12 我们仍然得到同样的错误。
  • 在c
    逻辑或表达式?表达式:条件表达式,
    在 C++ 中逻辑或表达式?表达式:赋值表达式
    所以c编译器很乐意将j作为条件表达式并继续。谢谢大家
【解决方案2】:

k=21>3?12:(j=10) 被评估为

if ( 21 > 3 )
    k = 12;
else
    k = ( j = 10 );

由于21>3true,else 条件不会被评估并且j 具有未定义的值(或它在此语句之前的任何值)。

【讨论】:

  • 抱歉问题已被编辑。原始问题,为什么 "k = 21 > 3 ? 12 : j = 10" 不被评估为 k = 21 > 3 ? 12 : (j = 10) 在 C 中
  • 如果j=10 周围没有括号,则从左到右的评估将j 分配给k,并在此之后进行附加分配。由于成功案例中有一个常量 (12)(不是左值),因此编译器会尝试解析将 10 分配给非左值并发出错误。
猜你喜欢
  • 2011-07-02
  • 2017-07-16
  • 2012-02-14
  • 2021-04-29
  • 2021-11-23
  • 2015-08-24
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多