c - 条件运算符的结果是左值还是右值?
问题描述
我们知道条件运算符返回一个左值,如果它Expr2
和Expr3
是相同类型的左值,否则它返回一个右值:
int main(){
int a = 0, b = 0;
(a == 1 ? a : b) = 1; // C++ OK. C: error. lvalue needed
return 0;
}
- 上面的代码在 C++ 上编译罚款,而在 C 上编译失败。
这是C上的输出:
main.c: In function ‘main’:
main.c:8:20: error: lvalue required as left operand of assignment
(a == 1 ? a : b) = 1;
^
解决方案
在 C 中,条件运算符的结果1是一个右值(C 标准术语中的“值”),因为 C 2018 6.3.2.1 2 说:
除非是运算符的操作数,
sizeof
运算符,unary &
运算++
符,--
运算符,或运算符的左操作数.
或赋值运算符,将不具有数组类型的左值转换为存储在指定对象中的值(并且不再是左值);…</p>
因此,虽然条件运算符的结果是它的第二个或第三个操作数,但该操作数已被转换为一个值并且不再是左值。
正如MM所说,您可以通过选择操作数的地址然后应用来获得与选择左值相同的效果*
:
*(a == 1 ? &a : &b) = 1;
脚注
1条件运算符的结果不是返回值,因为不涉及函数调用,所以没有调用和返回,只是表达式求值。
推荐阅读
- regex - how to extract the string from two delimiter strings using sed or awk or bash?
- c# - Add Default action in the route attribute
- c++ - What is wrong with the output of this attempt at dynamically resizing an array?
- python-3.x - 为什么我尝试提交表单返回“不是有效的日期时间值”
- javascript - 动态创建函数并将它们传递到 Google Docs 产品(Docs、Sheets 等)的自定义菜单中
- json - 使用 axios 发送 post 请求,参数为 JSON 对象
- bash - 在 Mac .bashrc 中分配变量以播放 afplay 'sound/path.mp3'
- html - Centering relative div to background image
- c++ - How to find out what module is missing with a C++ node addon
- c++ - how to implement this 2d vector to my code