為什麼c程式是自左向右掃描?像a (a的結果與(aa是不同的

2022-05-08 11:21:55 字數 6250 閱讀 5697

1樓:

從c++的語法來講,當a被宣告並賦初值後a+(a++)和(a++)+a結果是完全相同的,都是先計算,再增1;即,若a=2,則它們的值都是4,而最後a為3。這可用下面的**證實——

void main(void)

但是,如果寫成

void main(void)

結果就不一樣了,輸出成了6 3 4 2。這是因為c++的一條cout語句要從右而左計算表示式並壓棧:最右邊的a賦值為2未變仍為2;a+(a++) 中a++是後增1運算子,要在a+(a++) 運算完後才執行,所以它的值是2+2=4,然後a增1為2+1=3;再向左計算a為3;再向左計算(a++)+a,因仍為後增1運算子,所以表示式的值為a+a即3+3=6。

從棧裡彈出來輸出時是後進先出的,即成了6 3 4 2。以上分析說明並不是(a++)+a和a+(a++)有什麼不同,而是在同一條cout語句中表示式(a++)+a和a+(a++)中的a的值不同而已。

2樓:匿名使用者

這個問題不能一概而論。我給你兩個例子,你自己試一下,品味一下其中的規律。具體原因估計是編譯院裡的內容了。

例1:void main()

結果依次為:3 4 2 3例2:void main()

結果依次為:2 2 4 3

自己細細品味一下,瞭解其中的規律先記住,以後再好好研究。

3樓:愚英勳

c語言運算子有他自己的優先順序和結合方向,a++的a是先使用後自增,但是a+a(++)中的第一個a是自增以前的a,(a++)+a中的兩個a都自增了,不知道這樣解釋樓主懂不?

c語言中x=(a++)*(++a)和x=(++a)*(a++)運算後是多少?

4樓:匿名使用者

令i=3;

++i,i++;都是du

zhi將i加1,但是

令x=(++i); y=(i++);

++i是返回i加1後的值,故dao等於4即版x=4;

i++是返回i加1之前的值,故還是等於3即y=3;

樓主這時權的疑問來了:

為什麼不是12 和16呢?

但再這語句結束後,i都等於4;(***注意這句話***)注意:x*y,這句話,是先對x裡面的東西進行計算,對y裡面的東西進行計算,誰先計算不一定,可以看成是同時的進行計算的。在這之後(注意這句話,下面用到的),在進行乘法運算!

注意:在這之後,說明那個(++i)和(i++)語句執行完畢,再看上面的括號裡有***那句,明白了嗎?此時x和y都等於4,所以是16不是12;

舉個例子:

int i = 3, j = 3;

j++;

printf("%d, %d",(i++), j);

輸出的是3和4,不信試試。

5樓:匿名使用者

a++是語句結copy束後在後加

,++a是先加後計算再語句結束

x=(a++)*(++a);只執行了++a,得出結果x=16後,即本條語句執行完了,再執行a++,得出 a=5

所以結果是一樣的

如果是x=(a++)*(a++)

x=9,a=5 因為在本語句中a++沒執行 x=9之後 才自加2次 a=5

x=(++a)*(++a)

x=25,a=5 因為本語句中先執行++a,自加2次,x=25,a=5

6樓:匿名使用者

顯然是一樣的

x = (++a)*(a++)

和x = (a++)*(++a)

都是先掃描,因為都含有++a,所以先把a變為4然後做乘法 16

最後在對a++,a變為5

7樓:匿名使用者

a = 3;

x=(a++)*(++a) -- 先++a,再a*a,之後a++

下面的一樣...

c語言程式設計語句中的a++和++a有什麼區別,能舉個簡單例子嗎?

8樓:匿名使用者

a++是使用的

復a後,再對制a進行加1,a++是先賦值再自增.

++a是先把a加1,然後再使用a,++a是先自增在賦值。

#include

void main()

9樓:萢萢

a++是使用的a後,再對a進行加1。

++a是先把a加1,然後再使用a。版

如:int a=1;

printf("%d ", a++);

printf("%d", a);

輸出的權是1 2。

printf("%d ", ++a);

printf("%d", a);

輸出的是2 2。

10樓:ghoul荷蘭人

當 c=a++時,c是先被a賦值,再進行a=a+1

當c=++a時,先進行a=a+1,c再被a賦值

11樓:匿名使用者

a = 1;

b = a++; //b = 1 , a = 2c = ++a; //c = 3 , a = 3a++ 是先用a,在自加

++a 是先自加,在使用

c語言程式設計題: 執行下列程式段後,a值為() a=1;b=0; if((a++>++b)?a

12樓:

很簡單,看一下吧

a++是先使用a(來比較)再賦值,而++b正好相當,是先賦值給b再進行比較

a=1;

b=0;

然後if(a++>++b)的結果是if(1>1)即if(0),注:這裡0表示假,原因如上所述,而比較完之後肯定是a=2; b=1;

然後再因為if(0)執行b--,即b=0;

後面估計你也會明白了,a+=b;即為a=a+b;

a=2+0=2

13樓:匿名使用者

++在後變數先參與運算,運算後加1,++在前先自增1,再參與運算。

c語言中*a++和(*a)++有什麼不同?

14樓:茆德悟旻

也不算很難理解啊

說的通俗點

a++就是先把a當前的值

進行輸出或運算啥的

然後a在自增1

就是加1

++a也就先把a當前的值自增1

然後在輸出或運算啥的

好比a的值是1

b=++a

先把a當前的值1

自增1然後運算就是賦值給b

所以b=2

a=2b=a++

先把a當前的值1運算

就是賦值給b

所以b=1

然後a在自增1所以a=2

++--是1元運算副

具有右綜合性

優先順序高過

邏輯算術

賦值關係等這些運算副

15樓:度浩麗局妙

1,表示式的

值不同,++a的值是原a的值加1,a++是原a值例1int

a=1,

b;b=++a;

printf("%d",b);

例2int

a=1,

b;b=a++;

printf("%d",b);

2,++a可以做左值,a++不可以

例1int

a=1,

b=5;

++a=b;

printf("%d",a);

例2int

a=1,

b=5;

a++=b;/*這裡是個編譯錯誤*/

printf("%d",a);

16樓:閩恨甲瑾

hahugo88的回答很正確,這個意義必須掌握好哦!

我就是因為這個概念模糊考試丟了10分

17樓:澤男君

作為單獨的語句,a++;與++a;並沒什麼區別

但是b = a++;和b = ++a就有區別了

a++這個式子的返

回值是a,所以b = a++相當於b = a,然後a = a+1;

++a的返回值是a+1;所以b = ++a相當於a = a+1;然後b = a;

c語言是一門通用計算機程式語言,應用廣泛。c語言的設計目標是提供一種能以簡易的方式編譯、處理低階儲存器、產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。

儘管c語言提供了許多低階處理的功能,但仍然保持著良好跨平臺的特性,以一個標準規格寫出的c語言程式可在許多電腦平臺上進行編譯,甚至包含一些嵌入式處理器(微控制器或稱mcu)以及超級電腦等作業平臺。

二十世紀八十年代,為了避免各開發廠商用的c語言語法產生差異,由美國國家標準局為c語言訂定了一套完整的國際標準語法,稱為ansi c,作為c語言最初的標準。

18樓:夜神月

優先順序 () > ++ > *

*a++ 先執行++ 再執行 * 即指標先移動一個位置,在對移動後指標所指位置解引用取值。

(*a)++ 先執行*a 再執行++ 即先對指標所指位置解引用取值,再對這個值自增加1.

19樓:滄海雄風

*a++ 和(*a)++

區別 一個是 指標後移 一個是指標指向的內容自加舉例int *a, b[2]=,c;

a = b;

c=*a++ 那麼 a 指向1 則c等於2c=(*a)++ 那麼 c 等於2

過程不一樣而已

舉例子 一個是別人讓你移動一格

一個是你自己移動一格

20樓:

優先順序的關係自增的級別要高

c語言中為什麼a++的運算結果是一個右值 執行順序不是先返回a,然後a=a+1嗎

21樓:匿名使用者

左值(lvalue)和右值(rvalue)最先**於編譯。在c語言中表示位於賦值運算子兩側的兩個值,左邊的就叫左值,右邊的就叫右值。

定義:左值指的是如果一個表示式可以引用到某一個物件,並且這個物件是一塊記憶體空間且可以被檢查和儲存,那麼這個表示式就可以作為一個左值。

右值指的是引用了一個儲存在某個記憶體地址裡的資料。

從上面的兩個定義可以看出,左值其實要引用一個物件,而一個物件在我們的程式中又肯定有一個名字或者可以通過一個名字訪問到,所以左值又可以歸納為:左值表示程式中必須有一個特定的名字引用到這個值。而右值引用的是地址裡的內容,所以右值又可以歸納為:

右值表示程式中沒有一個特定的名字引用到這個值。

++a的話因為返回結果和運算之後的a一樣,所以++a返回的是真實的a,可以被重新賦值,所以可以作為左值。而a++返回的是運算之前的a,而此時a已經+1了,返回的資料其實是過去的a,它是另外複製出來的,而不是真正的a,所以無法被賦值,所以它只能是右值。

所以a++;在執行當中的順序是,先把a的值複製出來,進行整體運算,然後再a=a+1。

22樓:

討論很熱烈,但本人覺得沒有那麼複雜。++a可以做左值是因為++a是「一個變數」——即a=a+1後的變數a。是變數就可以充當表示式的左值。

而a++卻不是變數,它是表示式——即a+1,它還沒有計算出a+1的值並賦給a,所以不能充當左值——誰見過int a,b;然後a+1=9或a+b=1000或b+4=a+cos(b)這樣賦值的?意思不明確,所以c也不允許,不能給表示式賦值……

23樓:匿名使用者

a++是一個單獨的運算,也即是說不能先執行這個運算的前半部分,再執行別的運算,再執行這個運算的後半部分,因此如果a++是返回a,a自增1的話,返回的a一定是自增後的……

24樓:

a++執行順序不是先返回a,然後a=a+1嗎這是對的,

但a++這個表示式的值是a之前的值,不是a+1後的值,也就是說,a++這個表示式的結果,已經不與a同步了

既然不與a同步,那麼它就不是物件a,也不能取得其地址,它只是一個值,不是物件了,

所以它是右值

25樓:楊學涯

a++的運算順序是從右往左。即先計算a+1的值並賦給a。

26樓:惡靈的加護

所謂的右值,就是隻能放在等號右邊的值,即只能用來賦給別的變數,而不能被賦值。

++a的話因為返回結果和運算之後的a一樣,所以++a返回的是真實的a,可以被重新賦值。

而a++返回的是運算之前的a,而此時a已經+1了,返回的資料其實是過去的a,它是另外複製出來的,而不是真正的a,所以無法被賦值。

c語言為什麼for是死迴圈,C語言中程式如for為什麼是死迴圈

for 按語法,for 迴圈 初態 終態 步長 這三部分,現在 是 空語句 回 空語句 空語句 是合法的答語句。由於沒有給 終態 即允許繼續迴圈和終止迴圈的條件 迴圈語句於是可以 永遠繼續下去。俗稱 無限迴圈 或 死迴圈。但通常 迴圈體內 會有 語句控制 決定 是否中止。例如for for 當然,必...

看看這個c語言程式為什麼結果是

if 後沒有用 只對後面第一個分號前的語句起作用也就是b a這個語句 因為a然後執行a c 則a 3,接著執行c b,則c 2現在是a 3,b 2,c 2 所以輸出3,2,2 if後只執行一條語句 a c 假 b a 不執行但 a c c b 執行 a就變成了3 c也變成了2 就是 3 2 2 了 ...

為什麼在編譯C 程式的時候是沒有錯誤的,但是執行的時候就是

編譯通過只是說明沒有語法錯誤,執行不出結果就是你 邏輯問題了貼 看看吧,自己打斷點除錯一下 while r 0 寫反了吧,r 0 否則就成死迴圈了。可能是你沒有輸出結果吧?你可以跟蹤除錯一下就知道了 沒有編譯錯誤,有邏輯錯誤 你最好把 貼出來看看 這個c程式編譯顯示沒有錯誤,為什麼不能執行?引數復必...