左值

2013-12-14 46 views
1

爲什麼下面的代碼拋出C錯誤的第二行:左值要求作爲分配的左操作數左值

if (!str_cmp(type, "obj")){ 
    if (((OBJ_DATA*) tar = get_obj_here(NULL, room, target)) == NULL){ 
     bug("prog_destroy: obj target not found.", 0); 
     return; 
    } 
    else{ 
     list = (OBJ_DATA*) tar; 
     list = list->contains; 
    } 
    } 

回答

2

你不能施放的LHS一項任務。 也就是說(OBJ_DATA*)焦油不允許在第二行。

您可以使用它作爲

tar = get_obj_here(NULL, room, target) 

tar =(OBJ_DATA*) get_obj_here(NULL, room, target) 

取決於什麼get_obj_here()收益嘗試宣告OBJ_DATA * tar = NULL;然後。

+0

也看到這個http://stackoverflow.com/questions/5365153/what-happens-when-a-casted-pointer-has-an-increment-operator – gaurav5430

+0

*類型轉換*應* *投。 – haccks

+0

更正。 @haccks – alk

0

我認爲這是代碼錯誤。

根據這一question

你不能投賦值運算符的左操作數C.

question (Casting a pointer does not produce an lvalue. Why?)進入更多細節。

潛在的原因是,所有這些東西,包括你的演員, 創建一個新的價值。將值轉換爲已經存在的類型, 同樣會創建一個新值,不必介意指向不同 類型的指針是否具有相同的表示形式。在某些情況下,新的值恰好等於舊值,但原則上它是一個新值,它不打算用作對舊對象的引用,這就是爲什麼它是右值。

對於這些是左值,標準必須添加的,而不是一個新的價值的一些特殊 情況下,在一個 參考舊的對象上左值結果中,當一些操作。 AFAIK沒有 對這些特殊情況的巨大需求。

+0

如果我沒有記錯,Turbo-C允許這樣的操作。 – alk

+0

@alk:也適用於舊的GCC版本。 – ninjalj

2

投射結果爲r值。它不能在=運營商的左側(l值)完成。

if (((OBJ_DATA*) tar = get_obj_here(NULL, room, target)) == NULL) 
     ^
     | 
    Remove this data type