1樓:匿名使用者
首先,對於第一個問題我的答案是:否。
因為嚴格的講,賦值運算中必須有賦值運算子「=」就像你題目中的所說的那是自增自減語句。但是呢,他的結果又相當於一個賦值運算的結果。要不為啥說c靈活呢,是吧,呵呵。
對於第二個問題,我的答案是:都對!!!
因為,這完全取決於你所使用的編譯器,不同的編譯器對上述表示式的運算結果是不同的。
有的運算器是那三個自增運算同時進行,這時答案就是3;有的編譯器對那三個自增運算的運算順序是從左到右的,這時的答案就是5.
明白了吧,呵呵。
2樓:匿名使用者
根據《c語言規則》
①是。j++;等價於j=j+1; ,j--;相當於j=j-1;
所以自加自減語句都是賦值語句。
②int a=2; /定義了整型變數a,並賦了初值2*/(a++)a++)a++)假設令t=((a++)a++)a++)則 t=8 */
因為每一個相乘的因子都使用了一次,所以a在裡面都自增了一次。
即: a=a+3=5
3樓:網友
不同的編譯器結果不一樣。
什麼是c語言中關於自加自減?
4樓:匿名使用者
自增分字首自增和字尾自增。無論是什麼,執行自增都有1個***,就是原來變數的值會增加1。例如int a=1;a++;或int a=1;++a;執行後,a==2。
而他們的區別就在於整個自增表示式的值不同。如(a++)的值是變數a自增以前的值,如上面例子,(a++)1。而(++a)的值則是變數a自增以後的值,即(++a)==1+1==2。
結合性分為左結合和右結合,只有優先順序相同時才看結合性,例如表示式a+b*c+d-e*f,因為乘法優先順序別高於加減,所以a+(b*c)+d-(e*f),又因+-運算是左結合,所以只a+(b*c)再(a+(b*c))+d再(a+(b*c)+d)-(e*f),假如是右結合,就先d-(e*f),也就反過來了。這裡其實看不出有什麼區別,怎麼樣結果都一樣。
但看到*p++運算就不同了,因為*與++運算同一優先順序,左結合結果就是(*p)++右結合就是*(p++)這是區別很大的,書上還很多例子,你可以自己去看的。
強制轉換問題就是在可以轉換的情況下按要求轉換。如float x=;
則(int)x==9。將實型轉為整型是採用截掉小數部分的做法。
例如還可以整型轉字元常量等等,例如,int a=97;則(char)a=='a',因為字元a的ascll碼為97。
()裡面即是你要轉換的型別。
5樓:匿名使用者
通俗點吧,自增就是加1,分字首自增和字尾自增,字首自增就是先讓自己加1然後再使用,字尾自增就是先使用,然後這個原來的值加1,字尾自減也是如此。
6樓:匿名使用者
a++等價於a=a+1;先賦值後做加1操作;
a--等價於a=a-1;先賦值後做減1操作;
++a等價於a=a+1;先做加1操作後賦值;
--a等價於a=a-1;先做減1操作後賦值;;
7樓:匿名使用者
a++,a--
++a,--a
a+=,a-=
都算作自加自減,在具體使用下和普通的+-法沒有很大的區別,但是執行速度更快。
c語言的自加自減運算子
8樓:我才是柳隨風
這實在是個令人糾結的問題。
c語言中區分前自增與後自增,它們都有***,尤其是後自增。
前自增可能更好一點,它不產生臨時變數,效率更高一些。
++y相當於:y=y+1;在變數的使用之前先自增。
y++相當於:y; 其它語句。y=y+1;也就是使用它時,它的值不變,在其使用之後的某一時刻但在再次使用它前其值加一。而且不同的編譯器不一定有一致的實現行為。
a=(y++)y++)y++)這是一條語句,通常的編譯器實現會將此語句一次性掃描完成。這種情況下,y++會保持其值不變,此語句完成後,將y的值遞增3次。
b=(+y)+(y)+(y)這也是一條語句,編譯器掃描完此語句後,先將y遞增3次,再作+運算,將運算結果賦予b,此時b應該為24。 但是不同的系統及編譯器不一定這樣實現,還有可能y依次遞增,其結果是21。
9樓:齊爾大君雅
printf("%d",+i);/9i=9printf("%d",-i);/8i=8printf("%d",i++)8i=9printf("%d",i--)9i=8printf("%d",-i++)8i=9printf("%d",-i--)9i=8前面是輸出值,後面是執行該語句後的i值。-i++應該這樣分,輸出的是-i,執行後i自動加的值始終是正的,最後2個輸出的是-i。
10樓:沐晨長孫振國
第五個:-i
++是先把。
-i輸出,在i=i+1;則i
=9;輸出為:
-8第六個:
-i--是先把-i輸出,再i=i-1;則i=8;
輸出為-9;
輸出負數是因前面的。
-符號。,而i是正數。
11樓:昌秀榮歷媼
a++和++a,前一個先把a用了。
然後再給a加一,後一個。
先把a自己增加一然後再。
做運算;例如:x=5;
y=++x;
x先加到6,然後再將x的值應用到表示式y=x中,y值為6x,y都為6
x=5;y=x++;
x為6,y為5.
同樣,對於你的陣列也適用!
12樓:七彩虹科技****
從左往右看,比如++m,就是m的值先自加1,再呼叫,而m++就是先呼叫m,再自加1. 舉個例子 #include main() a的值先自加1,再呼叫,而b++就是先呼叫m。 -m m-- 同樣的意思,只不過是減法而已。
13樓:匿名使用者
第一條,實際上等於a=y+y+y,然後做三次y=y+1;
第二條,實際上是先做3次y=y+1,也就是b=8+8+8,應該是24……得,自己也亂了……
14樓:匿名使用者
如果你只是使用a=y 或b= y的話,語句是完全沒有問題的。但同一語句把y自增了多次,iso ansi c 沒有給出標準,在不同編譯器上的結果就可能不同。自增這樣的操作符雖然能寫出簡潔的**,但濫用的話可能帶來很多問題哦。
你最好把它分成幾條語句,就絕對沒有歧義了。《c primer plus》講解得很清楚。
15樓:白龍無馬
第一條是先使用該變數的值再進行累加。
第二條是先累加再使用該變數的值。
書上有寫的。
c語言的自增自減問題
16樓:勿忘心安
計算:從右往左,並輸出到「緩衝區」。
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另外自增 、自減 、還可能和編譯器有關係 。
17樓:小云小冉
這裡首先說一句,你這種用法應該是不合法的,至少是很不可取的。因為像+、-這類算術運算子c語言並未規定運算元的求值順序,在不同的編譯器上,有可能先求做運算元,也有可能先求右運算元。所以建議不要採用這種不確定的式子。
你這裡是先求左運算元,也就是先求++n表示式的值,因為是字首自增,表示式(左運算元)值為6,此時n也變為6.然後求右運算元值,即表示式n++;的值,因為是字尾自增,所以表示式的值是6,因此第二運算元的值是6,因此結果是36.之後n變為7.
18樓:匿名使用者
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
19樓:已存在這個名字
輸入6的時候,滿足if語句,x+1,輸出7,程式結束;
輸入4的時候,不滿足if語句,x+1,輸出5,x-1,程式結束。
20樓:傻仔青蛙
++在前面表示先進行變數自增,再執行算式,所以m=++i,先執行++i,i變為9,再賦值給m;
++在後面表示先進行算式,再執行變數自增,所以n=j++,先執行n=j,n被賦值為10,再j自增為11
21樓:匿名使用者
++前,表示先自加,後運算。
後++,表示先運算,後自加。
.所以,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.
22樓:匿名使用者
有一個簡單的記憶方法,++在前,就是先自增,i在後,就是自增以後再給值;相反,i在前,就是先給出i的值,++在後,就是把值給出來以後再自增。
m=++i; i先自增,自增以後為9,然後把9給mn=j++;先把j的值10給n,然後再自增,j變成了11所以得結果。
23樓:看灰過來了
把自增或者自減表示式作為函式引數,本身就應該被避免的,因為不同的編譯系統,在計算的時候,方法並不統一。例如;
i=1;c=fun(i,++i);
當從左向右計算,那就是c=fun(1,2);
要是從右向左計算,就是c=fun(2,2);
這類問題不必深究,而是應該在呼叫函式之前,將實參的值給它確定了,然後再作為實參去呼叫函式。
24樓:唐博
第一段**:
++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.
我懷疑你們老師的課件寫錯了,建議你去問問他。
25樓:windy笨笨狗
主要自增自減問題,方面你記憶,給個方法。
x++表示式的值從左到右看x的位置,此時x在++左,還沒有++,故 x++表示式的值就是x值。
相反++x,x在++右邊,表示式的值即x+1的值但是不管哪種,只要執行完了,x的值就+1
x--,x一樣。
故: 6時: if(6>5) ,輸出 74時: if(4>5)不滿足, 執行x--,但是此時x已經執行了一遍++,故x在--前為5
x--表示式的值 為5
希望對你有用,望採納。
26樓:錢柯偉有錢
這個問題以前我也不懂,現在會了。不懂確實很煩人。首先,i=8,m=++i,前置是先+1,再取值,那麼m=9,而此時的i就是+1之後的運算結果,i=9.
j=10,n=j++.在後,就是先取值,再+1;那麼n先取值就是的值就是j+1後的值,j=11.
c語言關於自增自減運算的問題,C語言裡關於自增自減運算子的問題
這種問題,沒必要糾結。如果是 q j j 結果是7 7 14連續加法,正常邏輯應該為3 8 24,但實際上,因為編譯器的優化,連加被分割為兩次暫存器運算,等價於 int edx j j q edx j 這樣就成了7 7 8 22 這是優化問題,不必糾結。這就是實際運算模式,如果明白彙編,可以看懂。 ...
C語言中增1減1運算子,c語言關於自增自減運算子的一個問題
小嫣老師 自增 和自減 操作符為物件加1或減1操作提供了方便簡短的實現方式。它們有前置和後置兩種使用形式。i 等同於 i i 1。和 既可寫在變數之前,稱為前置運算,如 a a 和 也可以寫在變數之後,稱為後置運算,如 a a 對單獨一個變數實行前置運算或後置運算,其結果是相同的,都是使該變數的值增...
c語言中自加 自減 運算的資料型別可以是float和do
小夏在深圳 不可以是double和float 只可以是整型。比如int a a 1 a a 則a 1 在c語言中還有一種更簡單的寫法,就是a 或者 a 這種寫法叫做自加或自增 意思很明確,就是自身加一。相應的,也有a 和 a,叫做自減,表示自身減一。和 分別稱為自增和自減運算子。自增和自減的示例 i...