(k < m ? k++ : m = k)
此特定表达式给出编译时错误,指出 lvalue required 。问题出在k++
上。无法理解此表达式中的错误。
答案 0 :(得分:5)
输入
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。
术语“左值”和“右值”主要是指“你可以在作业中留下的东西”和“你只能在作业的右侧 写的东西”。 C.F. “Are literal strings and function return values lvalues or rvalues?”。
查看?:
的语义的更简单示例:对于uint8_t k
,condition ? k : k + 1
是什么意思?
很容易看到前一部分k
是一个类型为uint8_t
的左值。
但后面的表达式k + 1
有些棘手。作为算术表达式的结果,它是一个rvalue。此外,它不是uint_8
,而是int
。
uint8_t
和int
的常见类型为int
。因此总共condition ? k : k + 1
是一个类型为int
的右值表达式。