1

我想知道,在下面的声明中,p是否是一个左值,即p这个声明中的表达式?(如果答案是“是”,它是一个左值,因为p用 value 改变了位于的对象&p的值&n)。

unsigned char *p = &n;
4

3 回答 3

4

C 说(强调我的)用于初始化标量:

(C99,6.7.8p11)“对象的初始值是表达式的初始值(转换后);与简单赋值相同的类型约束和转换适用,将标量的类型作为其声明的非限定版本类型。”

并且赋值运算符的约束表明左操作数必须是(可修改的)左值。

对于术语,声明既不是表达式也不是语句,但初始化程序可以是表达式。

于 2012-07-31T08:50:16.337 回答
2

从Stroustrups C++书的语法部分来看,声明语句不是表达式语句。我想这也适用于经典 C。因此,虽然您的初始化程序是一个表达式,但您的声明作为一个整体不是一个表达式。带等号的东西也不是严格意义上的赋值;相反,它是一个初始化,略有不同。出于同样的原因,p即使赋值和初始化共享许多通用规则,它也不是真正的表达式。

于 2012-07-31T08:54:04.413 回答
1

简短回答您的问题:不,声明不是表达式。声明可能包含用于确定类型的表达式,但仅此而已,初始化表达式也是一个表达式。

看来您关于左值的问题毫无意义。由于它不是表达式,因此它没有值。

于 2012-07-31T08:55:00.243 回答