#include <stdio.h>
int main()
{
int a=3,b=4,g;
a > b ? g = a : g = b ;
printf("%d",g);
return 0;
}
为什么不会打印g
的值?编译器说lvalue
是必需的。这是什么意思?
答案 0 :(得分:15)
由于运算符?:
优先于=
,表达式
a > b ? g = a : g = b;
将被解析为
(a > b ? g = a : g) = b;
表达式(a > b ? g = a : g)
将给出一个右值。赋值(=
)运算符的左操作数必须是左值 1 (可修改 2 ) 。
更改
a > b ? g = a : g = b ;
到
a > b ? (g = a) : (g = b);
或
g = a > b ? a : b;
<子> <强> 1 即可。 C11-§6.5.16/ 2:赋值运算符的左操作数应具有可修改的左值。
的 2 即可。 §6.3.2.1/ 1: 左值是一个表达式 (对象类型不是void)可能指定一个对象 ; 64)如果左值在评估时未指定对象,则行为未定义。当一个对象被称为具有特定类型时,该类型由用于指定该对象的左值指定。 可修改的左值是一个左值,它没有数组类型,没有不完整的类型,没有const限定类型,如果是结构或联合,则没有任何成员(包括,递归) ,所有包含聚合或联合的任何成员或元素具有常量类型。
答案 1 :(得分:0)
只需替换你的:
a > b ? g = a : g = b ;
与
a > b ? (g = a) : (g = b) ;
因为括号的先验更高。因此,如果条件a > b
变为真,则a的值被分配给g,如果失败,则将b的值分配给g。