声明是表达吗?

时间:2012-07-31 08:44:23

标签: c expression declaration

我想知道,在下面的声明中,p是否是左值,即p是否是此声明中的表达式? (如果答案为“是”,则为左值,因为p会更改位于&p的对象的值&n)。

unsigned char *p = &n;

3 个答案:

答案 0 :(得分:4)

C表示(强调我的)初始化标量:

  

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

看来你关于左值的问题毫无意义。由于它不是表达,它没有价值。