C中的三元条件运算符

Him*_*ngh 1 c turbo-c

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

此特定表达式给出了编译时错误,表示需要左值.问题在于k++.无法理解此表达式中的错误.

kay*_*kay 5

输入

k < m ? k++ : m = k;
Run Code Online (Sandbox Code Playgroud)

被解析为

((k < m) ? k++ : m) = k;
Run Code Online (Sandbox Code Playgroud)

k++rvalue 在哪里,m是一个左值.所以条件是一个右值.

你可能意味着什么

(k < m) ? k++ : (m = k);
Run Code Online (Sandbox Code Playgroud)

更好用

if (k < m) {
    k++;
} else {
    m = k;
}
Run Code Online (Sandbox Code Playgroud)

代替.

您可以在此处查看C优先级表:http://en.cppreference.com/w/c/language/operator_precedence.

术语"左值"和"右值"主要是指"你可以在作业中留下的东西"和"你只能在作业的右侧书写的东西",或者说.Cf" 文字字符串和函数返回值是左值还是右值? ".


查看语义的一个更简单的例子?::对于a 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.