【问题标题】:Ternary Conditional operator in C [duplicate]C中的三元条件运算符
【发布时间】:2014-10-21 16:19:31
【问题描述】:

(k < m ? k++ : m = k)

这个特定的表达式给出编译时错误说需要左值。问题在于k++。无法理解这个表达式有什么问题。

【问题讨论】:

  • 代码编译得很好(使用 g++ -Wall temp.cpp)。 AFAICT 它是有效的 C++。
  • 向我们展示涉及该表达式的完整行以及该行中涉及的所有变量的相关声明。

标签: c turbo-c


【解决方案1】:

输入

k < m ? k++ : m = k;

被解析为

((k < m) ? k++ : m) = k;

其中k++ 是一个右值,m 是一个左值。所以条件是一个右值。

你的意思可能是这样的

(k < m) ? k++ : (m = k);

更好的使用

if (k < m) {
    k++;
} else {
    m = k;
}

改为。

您可以查看 C 优先级表,例如这里:http://en.cppreference.com/w/c/language/operator_precedence

术语“左值”和“右值”主要表示“你可以写在作业左侧的东西”和“你可以只能写在作业右侧的东西”,分别。参考文献“Are literal strings and function return values lvalues or rvalues?”。


查看?: 语义的更简单示例:对于uint8_t kcondition ? k : k + 1 是什么意思?

  • 很容易看到前一部分k是一个uint8_t类型的左值。

  • 不过,后一个表达式k + 1 有点棘手。作为算术表达式的结果,它是一个右值。也不是uint_8,而是int

  • uint8_tint 的常用类型是int。所以总共condition ? k : k + 1 是一个类型为int 的右值表达式。

【讨论】:

  • 非常感谢。有任何链接可以让我了解有关优先级和左值、右值的更多信息,这样我就不会犯这样的错误了吗?
  • 例如cppreference.com 有一个运算符优先级列表。 “左值”和“右值”主要表示“你可以写在作业左侧的东西”和“你可以写在作业右侧的东西”,分别。参考文献stackoverflow.com/q/2038414/416224
猜你喜欢
  • 2010-10-20
  • 1970-01-01
  • 2013-07-13
  • 2015-02-15
  • 2022-12-06
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
相关资源
最近更新 更多