1樓:
首先++優先順序大於+
所以等價於:int y=(++a)+(a++)+(a++);
前置++,先加1後返回值。
後置++,先返回值後加1。
(++a)=1(執行完後,此時a的值為1)然後a++,先返回a的值,所以(++a)+(a++)=2(執行完後,此時a的值為2)。
所以(++a)+(a++)+(a++)=4(執行完後,此時a的值為3)
2樓:小呆小呆
y=++a+a+++a++; 滿足左結合規則,等價於:y=(++a)+(a++)+(a++);
首先執行++a,a變數變成了1,然後取a變數的值進行計算,答案為3。最後再執行兩次a++,最終a變數變成了3。
答案算出來應該是3,我試了兩種c++編譯器都是3。你的書應該是錯了。
3樓:
y=++a+a+++a++;雙目運算的從右向左運算,先計算最右邊的a++,這時候因為a=0,所以a++這個表示式的值為0,完了以後a加1,a的值就變成了1。然後算中間的a++,同理這個時候a=1,所以a++的值為1,完了以後a加1,a的值就變成了2.最後算最左邊的++a,這個時候是把a先加了1,a的值變成3,所以表示式++a的值為3,完了以後再把a+1.
所以得到y=3+1+0=4,而此時如果你再輸出a的值,就會發現a已經變成4了
4樓:匿名使用者
y=++a+a+++a++;
執行順序如下
a=a+1; //a=1
y=a; //y=1
y=y+a //y=2
a=a+1; //a=2
y=y+a; //y=4
a=a+1; //a=3
++a,先做自增,再使用a的值
a++,先使用a的值,再做自增
5樓:c加語言初學者
優先順序應該是這樣的y=((++a)+a+(++a))++
書上說++a=1, a++=0.這樣才對吧
y=(1)+1+(2)
6樓:匿名使用者
步驟是:++a,a=1;
y=a+a=2,:
++a,a=2;
y=2+a=4:
a++,a=3;
所以y=4.
7樓:匿名使用者
++a ,a變成了1
+a,就是+1
+++a,a變成了2,就是+2
所以是 1+1+2=4
最後a變成了3
8樓:菜鳥飛昇
#include
void main()
輸出:3
9樓:青竹隙雨
我錯了... shine1991的答案值得參考;
c語言中自增運算是什麼意思,麻煩舉個例子
10樓:**挖掘機
比較下面兩端程式
int a=0;
printf("%d\n",a++);
printf("%d",a);
這裡的輸出是01
int a=0;
printf("%d\n",++a);
printf("%d",a);
這裡的輸出是11
可以看出++a就是在執行語句之前就讓a自增1,a++就是在執行該語句後再讓a自增1.
11樓:
比如往一個罈子裡放東西,每次只放一個,而罈子裡的東西會每次多加一個
c語言中有自增運算++、自減運算--,並且可以前置和後置。 編寫一個程
12樓:匿名使用者
高中生回答;
不知道你c語言怎麼樣,我想應該不是很好吧。 所以先解釋下自增自減運算子的意思,--(++)變數前表示變數先減1(+1)在使用變數的值。若運算子在變數後則表示先使用變數,然後變數再加1。。。
下面舉個例子 #include〈stdio.h〉 main()
c語言的自增自減問題
13樓:勿忘心安
計算:從右往左,並輸出到「緩衝區」。
1、緩衝區是一堆疊
2、第一步:處理後面的「i--」。8進入緩衝區,i=7。緩衝區:8 <-(指標)
第二步:處理「i++」。7進入緩衝區,i=8。
緩衝區:7 8<-第三步:處理」--i「。
8進入緩衝區,i=7.緩衝區:8 7 8第四步:
處理「++i」 先自增1,然後8進入緩衝區,i=8 .緩衝區: 8 8 7 8
3、輸出緩衝區資料(棧規則):8 8 7 8另外自增 、自減 、還可能和編譯器有關係 。
14樓:匿名使用者
函式引數的求值順序是自右向左」更是大錯特錯。樓主,c語言跟大多數語言一樣,沒有規定表示式的求值順序,除了以下幾個順序點:
;(分號,標誌一條語句結束)
,(逗號操作符,函式引數列表裡面的逗號只起分隔作用,不是逗號操作符)
&&和||(邏輯與,邏輯或)
? : (條件運算子)
()(if,while,for, do..while,以及函式呼叫)
這些統稱為順序點,它們的求值順序有規定。我這裡只給你說明逗號操作符,其他的不一一作介紹(不然能寫一大篇呢),你自己參考相關資料。
逗號表示式最簡單的情形如下:
exp1, exp2;
c語言保證exp1在exp2之前求值,並且exp1求值的***保證在逗號之前生成。所以象下面這個逗號表示式:
int i = 1;
i++, (i == 2);
最後的值就是1,因為逗號表示式的前半部分i++的***(i自增1)在逗號之前已經生成,所以當執行到(i == 2)的時候,i的值已經是2了,所以i == 2成立,(i == 2)的值便作為整個逗號表示式的值。
但是,對函式原型,函式定義,函式呼叫,c語言裡面明確說明,引數列表裡面的逗號不是逗號操作符,只起到分隔作用,所以這裡的逗號不再是一個順序點,那它前後的表示式的求值順序就是任意的,並且所有帶***的表示式的***都要等到下一個順序點之後才是確定的,也就是說你只有等到下一個順序點之後,你才能準確得依賴這些表示式產生的***。
所以,像這樣的函式呼叫
foo(i++, ++i);是得不到準確的結果的。因為這裡逗號不是逗號操作符,所以就算編譯器選擇的是從左到右的求值順序,由於c語言不再保證i++的***在逗號之前生成,算到++i的時候,都不確定i到底有沒有自增1,不確定性就在這裡產生了。再者,如果編譯器選擇的是從右到左求值,同樣產生不確定性,這樣一來,傳進函式foo的兩個引數的值就可能不同,那麼最後的結果當然也就不同了。
你這裡一樣,printf是一個函式,
printf("%d,%d,%d\n",++i,--i,-i++);
是函式呼叫,括號內的所有逗號都不是逗號操作符,而只起到分隔引數的作用。所以++i,--i,-i++這三個表示式的求值順序是任意的,編譯器想怎麼算就怎麼算,不同的編譯器的「想法」可能相同可能不同,結果就可能一樣可能不一樣。這才是樓上的各位得到不同結果的真正原因!!!
樓主要好好參考順序點的定義和作用,並且牢記下面這條規則:
c語言裡面明確指出:在兩個順序點之間兩次改變同一個變數的任何嘗試得到的結果都是不確定的!
你這裡int i=10;
printf("%d,%d,%d\n",++i,--i,-i++);
的兩個順序點分別是int i=10;的分號,和包圍printf的引數的括號,c語言只保證位於兩個順序點之間的表示式求值產生***在第二個順序點之前生成,但不保證兩個順序點之間所有表示式的求值順序。你這裡++i,--i,-i++三個表示式企圖在兩個順序點前一個分號和()之間三次改變同一個變數i的值,所以結果註定是不確定的。至於為什麼c語言要規定相鄰順序點之間的表示式以任意順序求值,是為了給編譯器更多的自由空間,讓底層運算操作能由編譯器排程安排從而使運算更有效地執行。
另外,站長團上有產品**,便宜***
15樓:小云小冉
這裡首先說一句,你這種用法應該是不合法的,至少是很不可取的。因為像+、-、*、/這類算術運算子c語言並未規定運算元的求值順序,在不同的編譯器上,有可能先求做運算元,也有可能先求右運算元。所以建議不要採用這種不確定的式子。
你這裡是先求左運算元,也就是先求++n表示式的值,因為是字首自增,表示式(左運算元)值為6,此時n也變為6.然後求右運算元值,即表示式n++;的值,因為是字尾自增,所以表示式的值是6,因此第二運算元的值是6,因此結果是36.之後n變為7.
16樓:釗悟泥迎波
123456789main( )
17樓:匿名使用者
scanf輸入6[x=6], x>5成立, 緊接著無條件執行x++[x=7], 由於前面條件滿足, printf輸出7
scanf輸入4[x=4], x>5不成立, 緊接著無條件執行x++[x=5], 由於前面條件不滿足, printf輸出5, 執行x--[x=4]
因此輸入6時得到輸出7; 輸入4時得到輸出5
18樓:已存在這個名字
輸入6的時候,滿足if語句,x+1,輸出7,程式結束;
輸入4的時候,不滿足if語句,x+1,輸出5,x-1,程式結束。
19樓:傻仔青蛙
++在前面表示先進行變數自增,再執行算式,所以m=++i,先執行++i,i變為9,再賦值給m;
++在後面表示先進行算式,再執行變數自增,所以n=j++,先執行n=j,n被賦值為10,再j自增為11
20樓:匿名使用者
++前,表示先自加,後運算。
後++,表示先運算,後自加。
.所以,m=++i;先執行自加,即i=i+1;得i=9;
再運算,m=i;得m=9;
n=j++;先運算,即n=j;得n=10;
再自加,即j=j+1;得j=11;
.結果就是:
i=9,j=11,m=9,n=10.
21樓:匿名使用者
有一個簡單的記憶方法,++在前,就是先自增,i在後,就是自增以後再給值;相反,i在前,就是先給出i的值,++在後,就是把值給出來以後再自增。
m=++i; i先自增,自增以後為9,然後把9給mn=j++; 先把j的值10給n,然後再自增,j變成了11所以得結果。
如果滿意請採納
22樓:看灰過來了
把自增或者自減表示式作為函式引數,本身就應該被避免的,因為不同的編譯系統,在計算的時候,方法並不統一。例如;
i=1;
c=fun(i,++i);
當從左向右計算,那就是c=fun(1,2);
要是從右向左計算,就是c=fun(2,2);
這類問題不必深究,而是應該在呼叫函式之前,將實參的值給它確定了,然後再作為實參去呼叫函式
23樓:唐博
第一段**:
++i是先增加i的值,然後使用。
p=f(i,++i); 是先執行++i,後進行函式呼叫。因為執行了++i以後,i的值已經變成了3,
所以相當於p=f(3,3);
你可以在函式f裡面把a和b的值列印出來,你會發現a和b都是3.
第二段**:
i++是先使用i的值,然後把i的值加1.
所以相當於先執行p=f(2,2);
執行之後,把i的值變成3.答案應該是0.
我懷疑你們老師的課件寫錯了,建議你去問問他。
c語言中for的用法,C語言語言中FOR的用法
你這些程式肯定是某些二流教科書上,根本就是誤導人。for後面語句 需要迴圈的 不管是一句還是多句都要加!因為加 比不加 讓程式表述得更加清楚!printf d x,y 不會報錯,printf是一個多引數的c函式,編譯的時候,printf函式本身並不知道 引號 中需要多少個引數,它只是按照順序從堆疊上...
C語言中for迴圈語句,c語言中for語句是怎麼用的
for 語句包括三個表示式,第一個和第三個可以省略,省略第一個的意思是在for之前已經對變數初始化,例如i 0 for i 5 i 和for i 0 i 5 i 意思相同 第三個省略的意思也很明顯,原來的i 可以在for迴圈語句中實現,例如 for i 0 i 5 i 和for i 0 i 5 i ...
C語言中怎麼求數的階乘的位數,C語言中怎麼求一個數的階乘的位數
求階乘的 你在網上應該可以搜尋得到,至於求一個數的階乘的位數,可以用如版下代權碼實現 include stdio.h include math.h void main c語言程式實現 zhi如下 include void main while tmp 0 求位數的話把這個數取10的對數就行了。至於求...