【发布时间】:2014-10-21 16:19:31
【问题描述】:
(k < m ? k++ : m = k)
这个特定的表达式给出编译时错误说需要左值。问题在于k++。无法理解这个表达式有什么问题。
【问题讨论】:
-
代码编译得很好(使用 g++ -Wall temp.cpp)。 AFAICT 它是有效的 C++。
-
向我们展示涉及该表达式的完整行以及该行中涉及的所有变量的相关声明。
(k < m ? k++ : m = k)
这个特定的表达式给出编译时错误说需要左值。问题在于k++。无法理解这个表达式有什么问题。
【问题讨论】:
输入
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 k,condition ? k : k + 1 是什么意思?
很容易看到前一部分k是一个uint8_t类型的左值。
不过,后一个表达式k + 1 有点棘手。作为算术表达式的结果,它是一个右值。也不是uint_8,而是int。
uint8_t 和int 的常用类型是int。所以总共condition ? k : k + 1 是一个类型为int 的右值表达式。
【讨论】: