C語言自加問題,C語言 陣列 字元陣列 自加問題

2022-05-22 17:05:04 字數 5378 閱讀 7033

1樓:黃邦勇帥哥哥

字尾加加是先計算表示式再自加,k=(i++)+(i++)對於第乙個i來說,其表示式是i+(i++),對於第2個i來說其表示式是i+i,因此先計算i+i得到6,再計算第乙個i++得到4,再計算第2個i++得到5,最後i的值為5,k的值為6。

2樓:匿名使用者

後自增i++,i是在表示式完成運算才進行自加的,而先加++i則相反,是先自加,後完成,所以k=(i++)+(i++)=3+3=6;

而i的值先後自加兩次,所以最終i=5.

3樓:匿名使用者

int i=3,k;

k=(i++)+(++i);

k得8k=(i++)+(i++)+(++i);

k得10

k=(i++)+(i++)+(++i)+(i++)k得14

k=(i++)+(i++)+(i++)+(i++)+(i++)+(++i)+(i++)+(i++)

k得27

i的值都不會有問題,都如預料的那樣。

不會彙編,期待達人

所有的回答都解釋不了我列出來的全部。

不知道操作符堆疊操作順序的就別瞎說了。

如果不是(i++)+(i++)而是f(i)+f(i),而f(i)的作用跟i++完全一樣時,結果都不一樣。

這個問題其實算乙個bug.具體某個含多個(i++)的式子到底結果該是多少很難預言。

真正程式設計的時候最好別這麼用。

4樓:匿名使用者

你用的這個編譯系統是這樣執行的:先 i 不自增,所以 k = 6,而後 i 自增兩次, 所以 i =5.

有的系統是運算一次執行一次,那麼你這個就是:k = 7, i=4.

5樓:匿名使用者

因為i++是自加運算不會變值,再運算才會變值,

如k=i++;j=i;那j的值是4,k的值是3,i的值是4,

c語言 陣列 字元陣列 自加問題 20

6樓:匿名使用者

上面說的挺好的, 不過可能好像還有個問題沒有說, 我再補充下吧..

int a[10];

a是乙個陣列的首位址, 他是乙個常量指標, 其值是不能改變的, 如果你想通過移動指標來取陣列的下乙個元素, 可以這樣來做:

int* ptr = a;//宣告乙個int型別的指標指向陣列的首位址;

*(++ptr)取到的是a[1], 注意, 如果寫成*ptr++, 雖然++的優先順序高於*,但是p++具有滯後性, 也就是ptr先進行完操作(*ptr操作), 在使其值加1, 也就是說*ptr++取到的還是a[0]的值...

"字元陣列自加和陣列自加效果一樣嗎?"這句沒怎麼看懂,字元陣列也是陣列啊, 當然效果一樣...當然這裡你說的陣列自加也許說的是讓陣列名++, 上面說了, 陣列名是不能進行++操作的...

關於第二個問題

字元陣列gets(ch[i])這個很難說對錯, 要看具體情況, 如果ch[i]的值是乙個指向一段記憶體的首位址, 這樣是可以的(當然輸入的字元數要小於這段記憶體的總長度 - 1), 比如:

#define max_len 20

char* ch[5];

for(int i=0; i<5; i++)

但如果ch[i]只是乙個字元, 比如:

char ch[10];

gets(ch[1]);

這樣估計編譯也過不了...

7樓:匿名使用者

a++得到的是a[1]的位址。

另外gets(ch[i])不能這麼寫啊 函式原型char *gets( char *buffer ); 引數是指標型的,返回值也是指標型的。

8樓:黃邦勇帥哥哥

對於一維陣列,陣列名代表的是陣列的首位址,而且陣列名是乙個常量位址,也就是說陣列名的位址是不可改變的。因此陣列名是乙個位址,對陣列名使用加法運算,會使位址移到下乙個位置。就你的例子而言,陣列名a指向的是陣列中第乙個元素的位址,如果使用a+1,則使a指向了陣列中第二個元素的位址,要訪問位址中的元素,需要使用指標。

而對於常量而言,是不能使用a++這樣的語句的,也就是說不能使用諸如3++這樣的語句。你要把陣列的位址加1,需要使用a+1;

舉個例子:

int a=

cout<<(a+1)[0]<<*(a+1)<

c語言的自增自減問題

9樓:勿忘心安

計算:從右往左,並輸出到「緩衝區」。

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另外自增 、自減 、還可能和編譯器有關係 。

10樓:匿名使用者

函式引數的求值順序是自右向左」更是大錯特錯。樓主,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語言要規定相鄰順序點之間的表示式以任意順序求值,是為了給編譯器更多的自由空間,讓底層運算操作能由編譯器排程安排從而使運算更有效地執行。

另外,站長團上有產品**,便宜***

11樓:小雲小冉

這裡首先說一句,你這種用法應該是不合法的,至少是很不可取的。因為像+、-、*、/這類算術運算子c語言並未規定運算元的求值順序,在不同的編譯器上,有可能先求做運算元,也有可能先求右運算元。所以建議不要採用這種不確定的式子。

你這裡是先求左運算元,也就是先求++n表示式的值,因為是字首自增,表示式(左運算元)值為6,此時n也變為6.然後求右運算元值,即表示式n++;的值,因為是字尾自增,所以表示式的值是6,因此第二運算元的值是6,因此結果是36.之後n變為7.

12樓:釗悟泥迎波

123456789main( )

13樓:匿名使用者

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

14樓:已存在這個名字

輸入6的時候,滿足if語句,x+1,輸出7,程式結束;

輸入4的時候,不滿足if語句,x+1,輸出5,x-1,程式結束。

15樓:傻仔青蛙

++在前面表示先進行變數自增,再執行算式,所以m=++i,先執行++i,i變為9,再賦值給m;

++在後面表示先進行算式,再執行變數自增,所以n=j++,先執行n=j,n被賦值為10,再j自增為11

16樓:匿名使用者

++前,表示先自加,後運算。

後++,表示先運算,後自加。

.所以,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.

17樓:匿名使用者

有乙個簡單的記憶方法,++在前,就是先自增,i在後,就是自增以後再給值;相反,i在前,就是先給出i的值,++在後,就是把值給出來以後再自增。

m=++i; i先自增,自增以後為9,然後把9給mn=j++; 先把j的值10給n,然後再自增,j變成了11所以得結果。

如果滿意請採納

c語言字串陣列逆序問題,C語言字串陣列逆序問題

第乙個問題 字串陣列的長度不包括最後的 0 第二處問題 1 把 for i 0 str1 i 0 i 後面加上乙個分號 2 把for i 0 str1 i 0 i 後面的花括號去掉 3 再把 puts str1 前面的花括號去掉就可以了 程式如下 include stdio.h int main c...

c語言自增問題 關於c語言中自加自減的問題?

是這樣的,由於 有著最高的優先順序,第乙個 j,使得j 6 但是後面緊跟著的 j使j 7了,然後先進行乙個二元運算加法,得到結果14,然後再 j 從而得到的結果是22。在應用的過程中,最好不要使用,會歧義。你把整個 敲出來,這個q的值是21,除非在這個表示式前還有個 最好不要這樣使用自增,各版實現不...

C語言字串陣列

不是的,printf裡 s是通過後面的name定址到該記憶體單元,然後從該記憶體單元開始讀取資料,知道 0 字元結束。所以會把你輸入的東西輸出 是的,但是 s的含義是,把從這個位址開始的內容當作ascii碼依次輸出來,直到碰到 0 就是一種機械的做法 比如 int a printf s a 會輸出a...