賦值表示式和逗號表示式

2021-04-24 12:05:43 字數 3807 閱讀 4137

c++

把賦值運算子連線而成的式子叫做賦值表示式,例如:

a=b、

a=b+c

、a=3

等。賦值運算子是乙個雙目運算子,必須兩個參與運算的值,其左邊的值叫做

l-value

,通常是變數或賦值表示式,常量和常變數不可以作為賦值表示式的左值。賦值運算子右端的值叫做

r-value

,通常乙個常量、變數或表示式。

c++把逗號運算子連線的式子叫做逗號表示式,例如:「a,

a*3」,「

b+3,d/4

」等。逗號表示式右被稱為順序求值表示式,它的值是最右端的表示式的值。例如,有如下逗號表示式:

a*=5

,a+2

假設a=3

,該逗號表示式的求值步驟是,先計算左側的表示式

a*=5

,結果是

a=15

,然後計算右側的表示式

a+2,值是

17,整條逗號表示式的值為17。

把賦值符和逗號連線的式子作為表示式看待是

c++的特點之一,引入賦值表示式和逗號表示式使

c++的語句變得十分靈活豐富。合理的使用賦值表示式和逗號表示式可以大大精簡**,使程式更緊湊。下面,我們來看一看使用這兩種表示式時的技巧和應當注意到問題。

程式1:

#include

using

namespace std;

intmain()

大家可以先猜測一下程式的執行結果。

執行結果為

65535

。為什麼是這個結果呢?其實,仔細想一想很容易得出答案:我們知道,

short

型變數在記憶體中是佔兩個位元組的,即

16個二進位制位。因此,用-1給

b賦值以後,

b中的值就是

1111,1111,1111,1111

【注】,然後將其賦給a,

a所佔記憶體也是

16位,原封不動全部搬過去,

a的值也變成

1111,1111,1111,1111 ,a

是無符號數,它的所有位都表示數值,

1111,1111,1111,1111

對應的十進位制數即使

65535

,因此,輸出結果就是

65535。

【注】:所謂補碼,就是將該負的數絕對值的原碼取反後最低位加

1得到的二進位制編碼。例如,求取

-3的補碼步驟如下:

第一步:計算出

3的原碼:

0000,0000,0000,0011

第二步:將

3的原碼取反:

1111,1111,1111,1100

第三步:將取反後的原碼加1:

1111,1111,1111,1101

1111,1111,1111,1101

即是-3

的補碼。

例1的執行結果給了我們乙個警示——不同型別的變數相互賦值時一定要考慮他們的編碼形式即值域範圍,否則可能得到與我們的期望相差十萬八千里的結果。

例2:

#include

using

namespace std;

intmain()

這個例子無甚特別之處,它僅僅說明了賦值運算子可以跟基本運算子組合成為符合賦值運算子。常見到組合方式有+=、

-=、*=、

/=、%=、

<<=

、>>=、&=

、|=、∧=

,關於這些符合賦值運算子的用法,此處不作介紹,大部分教授

c++基礎的書上都有,不清楚的可以自己去檢視。下面,我們來看乙個有趣的問題。有如下表示式:

a=5*8,a*10

問,該表示式的值是多少?

討論對該表示式的求解,可能會有兩種不同的聲音:其一認為

a=5*8

是乙個賦值表示式,它跟後面的

a*10

一起構成了乙個逗號表示式,所以求解時先算出

a=5*8

的值,然後計算

a*10

的值;另一種聲音認為

5*8,a*10

是個逗號表示式,應當先求這個逗號表示式的值,然後將逗號表示式的值賦給

a。倒底那種理解對呢?這就需要查考兩種運算子的運算優先順序了。

賦值運算子的優先順序要高於逗號運算子,因此,對表示式

a=5*8,a*10

的求解應該是先計算

a=5*8

,然後計算逗號表示式的值。 例

3:#include

using

namespace std;

intmain()

問,輸出結果是多少?

很多人見到諸如

a+=a=a+=a

這樣的表示式時,還沒思考,先就頭腦發暈了。其實,大可不必這麼惶恐,冷靜下來,仔細想一想,這個表示式還是很容易求解的。要求解這個表示式,需要知道乙個先決條件——賦值運算的求值順序。賦值運算都是從右至左求值的。知道了這一點,問題就迎刃而解了。下面是對該表示式的求解過程:

第一步:計算最右端的

a+=a

,結果為6;

第二步:將

a+=a

的值賦給前乙個a,

a變為6;

第三步:計算最左端的

a+=a

,結果為12,

12即為整個表示式的值。

好了,現在大家對連續多次賦值的賦值表示式的求解應該沒有問題了。不過,上例中還有個需要注意的地方,不知道大家有沒有留意,

cout

語句中「

a+=a=a+=a

」是加括號的。在用

cout

輸出賦值表示式或逗號表示式的值時一定要用括號將整個表示式括起來,否則,編譯會出錯,這主要是因為

c++的輸出流物件

ostream

中沒有處理賦值運算子和逗號運算子的機制,如果你過載了

<<

運算子,實現了這個機制,就可以不要括號了

(不過,要過載

<<

實現輸出賦值表示式是個比較複雜的問題,遠不如加個括號來得輕快

,因此,牢記,輸出賦值或逗號表示式時一定要用括號把正個表示式括起來)。

總結賦值表示式和逗號表示式的通常用法:

一、賦值表示式的用法: 1.

用於對多個變數賦值,如:

a=b=c=d=3;

2.用於條件語句的條件,如:

if(a=fun(x,y)){}

,這時相當於執行

a=fun(x,y);

if(a){}

賦值表示式通常用於以上兩種情況,但不限於此,靈活運用賦值表示式可以極大精簡程式**,使程式更加緊湊,更多用法,請自己去研究。

二、逗號表示式的用法: 1.

用於順序求值,如:

a=b,

b=c,

c=d;

相當於執行:

a=b;

b=c;

c=d;

3.用於條件語句,如:

if(a=fun(x,y),a>0){}

,這時相當於執行

a=fun(x,y);

if(a>0){}

條件表示式通常用於以上兩種情況,但不限於此,逗號語句的最大特點在於它可以在一條語句中整合多種不同型別的表示式,用一條語句實現多個功能。例如,有如下可編譯執行程式:

#include

using

namespace std;

intmain()

逗號表示式極大的增強了

c++語句的靈活性,使用逗號表示式可以精簡程式**,希望大家在程式設計過程中靈活的使用逗號表示式,簡化自己從程式**,使**更緊湊,更具可讀性。

逗號表示式

c語言提供一種特殊的運算子 逗號運算子。用它將兩個表示式連線起來。如 3 5,6 8 稱為逗號表示式,又稱為 順序求值運算子 逗號表示式的一般形式為 表示式1,表示式2 逗號表示式的求解過程是 先求解表示式1,再求解表示式2。整個逗號表示式的值是表示式2的值。例如,上面的逗號表示式 3 5,6 8 ...

逗號表示式

c語言提供一種特殊的運算子 逗號運算子。用它將兩個表示式連線起來。如 3 5,6 8 稱為逗號表示式,又稱為 順序求值運算子 逗號表示式的一般形式為 表示式1,表示式2 逗號表示式的求解過程是 先求解表示式1,再求解表示式2。整個逗號表示式的值是表示式2的值。例如,上面的逗號表示式 3 5,6 8 ...

逗號表示式

define a b,c 表示式1,表示式2,表示式3,表示式n 逗號表示式的要領 1 逗號表示式的運算過程為 從左往右逐個計算表示式。2 逗號表示式作為乙個整體,它的值為最後乙個表示式 也即表示式n 的值。3 逗號運算子的優先級別在所有運算子中最低。c語言提供一種特殊的運算子,逗號運算子,優先級別...