2012-07-31 64 views
0

我想知道,在下面的聲明,p是左值,即是p在這個聲明中表達? (如果答案是「是」,這是一個左值,因爲p改變位於&p與價值&n對象的值)。是一個表達式的聲明嗎?

unsigned char *p = &n; 

回答

4

Ç說(重點煤礦)爲標量的初始化:

(C99,6.7.8p11)「的對象的初始值是,式(變換後)的; 與簡單賦值相同的類型約束和轉換應用,將標量的類型作爲其聲明類型的非限定版本。「

並且賦值運算符的約束條件表示左操作數必須是(可修改的)左值。

而且對於術語,而聲明並非一個表達,也不是語句,但是在初始化可以是一個表達式。

1

從Stroustrups C++書的語法部分來看,一個聲明語句不是表達式語句。我想這也適用於經典的C語言。所以雖然你的初始化器是一個表達式,但你的聲明作爲一個整體並不是一個表達式。等號的東西也不是嚴格意義上的任務;相反,它是一個初始化,稍有不同。出於同樣的原因,p不是一個真正的表達式,即使賦值和初始化有許多共同的規則。

1

簡短的回答你的問題:沒有,聲明不是一個表達式。聲明可能包含表達式來確定類型,但就是這樣,初始化表達式也是一個表達式。

看作是你對左值的問題是沒有意義的。既然它不是一個表達,它沒有價值。