我想知道,在下面的声明中,p
是否是左值,即p
是否是此声明中的表达式? (如果答案为“是”,则为左值,因为p
会更改位于&p
的对象的值&n
)。
unsigned char *p = &n;
答案 0 :(得分:4)
C表示(强调我的)初始化标量:
(C99,6.7.8p11)“对象的初始值是表达式的初始值(转换后); 与简单赋值相同的类型约束和转换,取类型标量是其声明类型的非限定版本。“
并且赋值运算符的约束说左操作数必须是(可修改的)左值。
对于术语,声明不是表达式也不是声明,但初始化器可以是表达式。
答案 1 :(得分:2)
从Stroustrups C ++书的语法部分来看,声明语句不是表达式语句。我想这也适用于经典C.因此,虽然初始化程序是一个表达式,但整个声明不是表达式。在严格意义上,等号的东西也不是真正的赋值;相反,它是一个初始化,略有不同。出于同样的原因,即使赋值和初始化共享许多通用规则,p
也不是真正的表达式。
答案 2 :(得分:1)
对你的问题的简短回答:不,声明不是表达。声明可能包含用于确定类型的表达式,但就是这样,初始化表达式也是表达式。
看来你关于左值的问题毫无意义。由于它不是表达,它没有价值。