編譯程序必須修改左值嗎
㈠ C++左值問題
要准確理解左值和右值的概念,首先需要明確我們指的是 C 還是 C++ 中的左值或右值。這是因為 C 和 C++ 對於左值及右值的定義是有區別的。另外,左值和右值的概念人為規定的成份很大,往往給出的定義不能囊括所有情況。
>> 《TCPL》A.5:An object is a named region of storage, an l-value is an expression referring to an object.
對於 C 語言來說,這個定義就不是太准確,特別在 C99 標准出台之後更是如此。這個定義中規定了「對象(object)」是「有名存儲區(a named region of storage)」。且不說動態分配的內存(無名存儲區)能否作為對象,只就 string literal 以及在 C99 中新增加的 Compound litertal 而言(它們都是對象,並且都是左值,但是又都是沒有名字表示的),就不在上述定義的界定范圍之內。
對於 C++ 來說,這個定義就更不適用了。因為 C++ 中對象也可能是一個非左值,即右值。同理,ISO/IEC9899 中為 C 語言提供的左值的定義也不適用於 C++。
>> "lvalue"還可以分為一般的"lvalue"和"modifiable lvalue"。
這句話說得比較別扭。是否可改為 "lvalue" 還可以分為"modifiable lvalue" 和 "unmodifiable lvalue"?
>> "lvalue"必須對應於一塊確定的內存空間,並且在編譯時已經確定了
《ISO/IEC9899 WG14/N1124》P58:An l-value is an expression with an object type or an incomplete type other than void.
根據上述定義,對於非 void 的非完整類型(incomplete type)的引用也是左值;而我們知道在程序中對於非完整類型是不能進行引用的,否則會在編譯時產生錯誤。
因此,左值只是對應著某一存儲空間,而與此存儲空間是否真實存在、是否能夠實際訪問無關,更談不上是在編譯時確定的了——這顯然否定了動態分配的對象也可以是左值。
>> "lvalue"可以作為"rvalue",但是"rvalue"不一定可以作為"lvalue"來使用。
左值和右值的概念是對立的,即非左即右(根據C++標准對左值的定義,C標准沒有明確這么說)。左值可以作為右值是因為 C 和 C++ 標准中規定的 lvalue-to-rvalue 轉換所致,但是右值不是「不一定」、是一定不能作為左值來使用。
>> 它是"lvalue"而且還是"modifiable lvalue",要不然如何初始化呢?
左值對象都可以被初始化,即使是對於不能改變的左值也是如此。否則,如果不能初始化你又如何使用它呢?因為未初始化就使用是非法的。顯然上面一句的「初始化」應該是「賦值」的筆誤。
㈡ C語言,提示:表達式必須是可修改的左值
= 改成== =是復值 ==是邏輯上的等於
-------------------------------------------
還有 sqrt返回值是double型的
因為i是float型,所以printf("%d",i);改為printf("%f\n",i);
}; 這里不要加分號
㈢ C語言表達式必須是可修改的左值
b > max ? max = b : max = max;
這句的符號優先順序有點亂,你這句等同於
(b > max ? max = b : max) = max;
(b > max ? max = b : max)的結果是個常量,當然不可以修改(就是左值)
㈣ 在c的編譯器中」,」運算符是不能做為左值的,但在C++中可以是嗎
在C語言中,左值(left value),指在賦值表達式(assignment expression)中作為將要賦予值的地址的表達式。
例如在賦值語句
1
i = 10;
中i就是一個左值,它必須是一個變數,或是一個解引用的指針(如下)
1
2
int *p;
*p = 10;
在C的yacc語法中,賦值表達式被這樣定義
assignment_expression
: conditional_expression
| unary_expression assignment_operator assignment_expression
;
也就是說,在純語法的層面,左值必須是一元表達式
㈤ 表達式必須是可修改的左值是什麼意思
就是說= 左邊必須是變數,x%i是表示,所以不能賦值
if (x%i==0)break; 應該是 ==
㈥ C語言中表達式必須是可修改的左值是什麼意思
意思是賦值號左側的是只能是變數,不能是表達式。
通過變數名來訪問變數,是一種「相對安全」的方式。因為只有你定義了它,你才能夠訪問相應的變數。這就是對內存的基本認知。但是,如果光知道這一點的話,其實還是不知道內存是如何存放變數的,因為底層是如何工作的,依舊不清楚。
要繼續深究的話,就需要把變數在內存中真正的樣子是什麼搞清楚。內存的最小索引單元是1位元組,那麼你其實可以把內存比作一個超級大的「字元型數組」。數組是有下標的,我們是通過數組名和下標來訪問數組中的元素。

(6)編譯程序必須修改左值嗎擴展閱讀
那麼內存也是一樣,只不過起了個新名字:地址。每個地址可以存放「1位元組」的數據,所以如果我們需要定義一個整型變數,就需要佔據4個內存單元。
其實在程序運行的過程中,完全不需要變數名的參與。變數名只是方便進行代碼的編寫和閱讀,只有程序員和編譯器知道這個東西的存在。
而編譯器還知道具體的變數名對應的「內存地址」,這個是我們不知道的,因此編譯器就像一個橋梁。當讀取某一個變數的時候,編譯器就會找到變數名所對應的地址,讀取對應的值。
㈦ C++表達式必須是可修改的左值
就是說= 左邊必須是變數,x%i是表示,所以不能賦值
if (x%i==0)break; 應該是 ==
isLeapYear (d) == true && d.month = 2
() == && . 這幾個運算符的優先順序高於 =
所以你寫的表達式的含義是
( isLeapYear (d) == true && d.month ) = 2
( isLeapYear (d) == true && d.month ) 不是可修改的左值
甚至連左值都不是
所以你的式子類似於 1 = 2
顯然是錯誤的
我猜你要表達的是
isLeapYear (d) == true && d.month == 2
你錯把 == (等於)寫成了 = (賦值)
㈧ vs c++編譯程序後提示 表達式必須是可修改的左值 是怎麼回事兒啊如下
你是不是想寫成if(m%i
==
0),對比要使用==,一個等號=為賦值運算符,左值是指=左邊必須為一個可修改的變數,m%i是一個表達式,不可修改,所以提示錯誤。
建議在比較時,盡量將常量放到左測,這樣更容易發現問題,如:if(0
==
m%i)。
滿意請採納。
㈨ C++指針引用問題,非常量引用的初始值必須為左值
「非常量引用的初始值必須為左值」,左值基本上可以理解為能對其取地址的值,如果地址都沒有,怎麼可能作為非常量引用的值呢?如果可以,那麼將出現以下情況:
int &a = 5;//5是右值,a是非常量引用
a = 6;//把5這個右值的值改為6,這明顯是不合適的
「在參數里取地址再傳進去就允許」這個不是很明白你想表達什麼,對右值取地址?
㈩ C語言語法問題,左操作數必須為左值是什麼意思啊我該怎麼改啊
所謂左值是指一個能用於賦值運算左邊的表達式。左值必須能夠被修改,不能是常量。我們用變數作左值,還可以看到,指針和引用也可以作左值。改成b=9-c。
一般形式為:變數=表達式。它的作用是將一個表達式的值賦給一個左值。
計算賦值運算符右側表達式的值(「=」為賦值運算符),將賦值運算符右側表達式的值賦給左側的變數,將賦值運算符左側的變數的值作為表達式的值。
例如:
int
a,
b,
c;
a=3;
b=4;
c
=
(
a
+
b
)*(2*a
-
b)
//
得出14
(10)編譯程序必須修改左值嗎擴展閱讀:
注意
1.
多重賦值表達式不能出現在變數說明中。例如:
int
i=j=0;
是非法的。
例:有變數說明
int
a=2,b;
指出下面表達式運算後a和b的結果。
b+=b=++a;
答:a為3,b為6。
<>
有時將賦值運算與比較運算結合在一起形成嵌入賦值。例如:
while
((ch=getchar())!='\n');
這條語句的含義是:等待用戶按下回車鍵後程序向下執行。
2.
x
*=
y+8等價於x=x*(y+8),不等價於
x
=
x*y+8。
同樣:z
&=
y-x等價於z
=
z
&
(y-x),而不等價於z
=
z
&y
-x。
參考資料:
搜狗網路-賦值運算符
