C中的三元条件运算符

时间:2014-10-21 16:19:31

标签: c turbo-c

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

此特定表达式给出编译时错误,指出 lvalue required 。问题出在k++上。无法理解此表达式中的错误。

1 个答案:

答案 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 kcondition ? k : k + 1是什么意思?

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

  • 但后面的表达式k + 1有些棘手。作为算术表达式的结果,它是一个rvalue。此外,它不是uint_8,而是int

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