2012-07-31 92 views
0

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

unsigned char *p = &n; 

回答

4

Ç说(重点煤矿)为标量的初始化:

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

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

而且对于术语,而声明并非一个表达,也不是语句,但是在初始化可以是一个表达式。

1

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

1

简短的回答你的问题:没有,声明不是一个表达式。声明可能包含表达式来确定类型,但就是这样,初始化表达式也是一个表达式。

看作是你对左值的问题是没有意义的。既然它不是一个表达,它没有价值。