1樓:阿冬
這種問題在不同的編譯器中可能會得到不同的答案,不建議你仔細扣這種特殊的語法,程式設計的時候也沒有人會這麼寫。真正的高手寫出的程式是優雅且易懂的,而不是有可能產生歧義的。
2樓:匿名使用者
第三個a++的值是3呀,
++a是a的值先自增,再參與運算
a++是a的值先參與運算,再自增
b=(1)1+1(2)+2(3)+3(4)
3樓:汐
上式可改為:(++a)+(a++)+(a++)+(a++),一共四個a
第一個++a是a先自增一然後再做加法此時a=1,式子變成1+(a++)+(a++)+(a++),而a++表示先做加法再自增1;第二個a時,a=1先做加法,式子變成1+1+(a++)+(a++),然後a自增1此時a=2;第三個a時,同第二個a,式子變成1+1+2+(a++),此時a自增1變成3;第四個a時式子變成1+1+2+(3++)=4+(3++)=4+3=7,而a自增1變成4,。最後a=4,b=7。
此類題的關鍵解法是a++表示a先運算,然後再自增1;++a表示先自增1,再參與運算。
4樓:匿名使用者
從左往右看b=(++0)+(1++)+(2++)+(3++)=1+1+2+3
在c語言中, int a=5,b; b=(++a)+(++a); 輸出後為a=7,b=14這不合常
5樓:兄弟連教育北京總校
由於逗號運算子的優先順序最低,在「表示式1,表示式2,...,表示式n,」中,逗號表示式的結果為最後一個表示式的值,即表示式n的值。
如果語句為a=a+b,a-b;則先運算a=a+b,再運算a-b,而整個逗號表示式的值為5,即a-b的值,最後結果為a=11,b=6。
如果語句為a=(a+b,a-b);則先運算a+b,結果無意義,再運算a-b,結果賦值作為逗號表示式的結果賦值給a,最後結果為a=-1,b=6。
6樓:潛水灰飛煙滅
第一題均為字首,首先進行+1運算,即b = 7+ 7.
第二題為字尾,y=(x++,x);表示式完畢後x+1 == 6,然後x賦值於y,後面應該還有個printf的輸出語句吧,執行printf時輸出x = 6 ,y = 6
7樓:忘記
++a的運算優先順序比較高,所以先計算兩個++a,然後執行加法;第二題x++,是先右邊值賦值給y,但是會先執行括號左邊的x++,變成了6,然後再執行右邊單獨的x
在c語言中,int a=5,b; b=++a*--a;b的結果為多少?
8樓:匿名使用者
a=5;
b=++a[6]*--a[5]=30
9樓:匿名使用者
嚴格來說這種寫法不滿足c編碼安全標準——exp30-c. 不要依賴序列點之間的求值順序
表示式的求值可能會產生***。在執行期間稱為序列點的特定位置,前一次求值的所有***都已經完成,而下一個求值的所以***都還沒有發生。
在前一個序列點和下一個序列點之間,一個物件所儲存的值只能被一個表示式修改一次。另外,讀取前一個值只能用於確定需要儲存的值。
上述例子中++a和--a這種行為就是未定義的。在編碼中必須有明確的計算順序,否則結果在不同的編譯器環境下不同。因此必須將其分成幾條語句寫。
樓上的彙編是基於gcc編譯器來寫的,如果是其他的編譯器,結果就可能不一樣了。
10樓:匿名使用者
答案:25
從下面的**可以看出,事實也是++,--都比*優先順序別高,實際執行a先自加1,為6,再自減1,為5,在經行乘法運算
測試**
int main()
彙編**
main:
leal 4(%esp), %ecxandl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $36, %esp
movl $5, -12(%ebp)addl $1, -12(%ebp)subl $1, -12(%ebp)movl -12(%ebp), %eaximull -12(%ebp), %eaxmovl %eax, -8(%ebp)movl -8(%ebp), %eaxmovl %eax, 4(%esp)movl $.lc0, (%esp)call printf
addl $36, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %espret.size main, .-main.
ident "gcc: (gnu) 4.1.
2 20070502 (red hat 4.1.2-12)"
.section .note.gnu-stack,"",@progbits
11樓:匿名使用者
跟c編譯器的實現有關,有可能是24 也有可能是30 這種**是應該被禁止使用的
12樓:
其實這種題要看是什麼軟體編譯執行的 在vc中b=25 我執行了的 ++ --的優先順序要比*要高 要是自己以後走上社會要程式設計最好避免這種語句加2個括號啥事都解決了
13樓:
編譯平臺不同結果就不同。這種有歧義的**是應該避免的,不宜維護,不宜讀寫。
在c語言中,執行以下語句: int a,b; a=b=c=1; ++a||++b&&++c; 結果求a,b的值。
14樓:匿名使用者
首先執行++a,a變成2,++a表示式的值也是2,為邏輯真,於是邏輯或||右邊的不再計算
這樣執行後a=2,b=1, c = 1
&& 級別高於||
這個邏輯表示式中不是嚴格按運算子優先順序計算的,只要左邊可以計算出邏輯表示式的值,後面的不再運算
15樓:
都是2,還有他們的級別的一樣的!
c語言中。int a=1,b=0,c=1; 執行語句 !b||++a&&++c 後,a,b,c
16樓:
或運算,而且是左結合,!b為真,整個表示式就為真了,不再繼續運算,也就是++a和++c沒有運算,表示式的結果就出來了。
17樓:匿名使用者
|後首先根據運算子優先順序和結合性。((!
b))||((++a)&&(++c))
然後先算!b,此時(!b)=1,為true,於是不需要專算||後的內容了。屬
因為:true||任意表示式=true。
注意,運算子優先順序不代表計算優先順序。
如果你把b=1 結果就是212
18樓:卿楓凌
對於!b||++a&&++c;按照規bai
定, 要先計du算 && (&&的優先順序zhi比||高)也就是需要計算dao出 ++b和c++;
但是按專照優化, 只要計算出 a>0 就可屬以了,不需要計算出 ++b和c++,「||」在這裡起到了短路的功能(短路就是,當第一條表示式能決定整條表示式的結果,那麼後面的語句都不執行!),這也叫做布林法則,給你推薦一本書叫做「c語言解惑」。望採納
c語言中a+++++b應該怎麼理解?
19樓:super丶
a+++++b在編譯時會報錯,(a++)+(++b)和a++ + ++b不會報錯
「a+++++b」這一段根本就無法解析,編譯系統從左至右掃描整條語句,先遇到a++,判斷出來是一個a的字尾自加運算,然後接著掃描,遇到一個+,+是一個二目運算子,它的左邊已經有一個運算數a++了,系統就向右搜尋第二個運算數,又遇到一個+,++比+的運算級別要高,這時,編譯系統就將兩個+看成一個整體來處理,既然是++,編譯系統就認定,肯定它的左邊或右邊有一個變數,編譯系統先搜尋左邊,發現++,不是變數,再搜尋右邊,發現+b,+b是什麼東西?編譯系統是無法搞明白的,因此它就認為++是一個缺少左值的自增運算子,於是提示提示使用者:』++』 needs l-value
另外,假如定義int a = 1,b = 2;
c = a++ + ++b;
1:先執行b自加,b變為3;相當於:b = b+ 1;
2:求a與b之和,賦給c;相當於:c = a + b ;//c = 1+3;
3:執行第二步之後,a自加1:a++;
4:如果要輸出的話,(按執行順序)
b = 3;
c = 4;
a = 2;
20樓:北京泗洪人
a+++++b,應該理解成:(a++) + (++b)。
左值(lvalue) 是b語言/c語言/c++語言等類c語言中的一類表示式。「左」(left)的原意是指可以放在賦值符號「=」的左邊,但其實也表示能作為&和++等操作符的運算元(b語言中已經如此)。而且,現代c/c++中的含義已經不侷限於此。
lvalue的l被重新解釋為location。這也對應於iso c11/iso c++11的記憶體位置(memory location)。
總結:a存在左值,可以有表示式:a++。但是(a++)不存在左值,無法繼續執行(a++)++操作。
21樓:
(a++)+(++b)
= a + (b+1)
注意區分a++和++a
a++先用a的值賦值之後再進行++操作
++a是先++之後在進行賦值操作
如上圖:
a = 2; ---> a++; // a = 2b = 3; ---> ++b; // b = 4
22樓:l語言之父
(a++)+(++b)
c語言中c=(++a,b++,a++,++b);表示的是什麼意思?
23樓:匿名使用者
c=(++a,b++,a++,++b);逗號運算子是從左往右做取最後一個表示式的值++a後a的值為11,b++後b的值為11,a++後a得值為12,++b後b的值為12++b的意思是先做自增然後取b得值。所以整體c輸出為12另b++表示先取b得值為表示式的值然後在做自增。a++和++a也是同理。
24樓:匿名使用者
最後c=12。(++a,b++,a++,++b);是個逗號表示式,從左到右計算。c的結果由表示式最右邊的式子決定。
++a之後a=11;b++之後b=11;a++之後a=12;++b之後表示式值為12,b的值為12。
25樓:萊玉巧辛嫻
b是一個整型變數,a也是一個整型變數,c是一個整型陣列,所以c[a],就是取c陣列裡,a變數所指下標位置的值,b+=c[a]
就是等價於
b=b+c[a]
c語言a+=b++==0表示什麼意思
26樓:匿名使用者
首先,b++表示對b做自加運算,我們用c代替,c=b++;
然後,a+=b++ 等於 a+=c,即a=a+c,也就是說「==」之前部分是給a賦值的,我們用d代替,即d=a+c;
最後是一個邏輯判斷d==0,也就是判斷前面計算出來的a是否等於0.
這裡要注意的一個地方是b++,不是++b,也就是說在當前這一次判斷的時候b並不自加,而是在當前判斷執行完之後才自加1.
比如初始a=1, b=2,b沒有自加,a=a+b=1+2=3,那麼這句話這次是在判斷「3==0」,下次再判斷的時候b才自加變成了2,a=a+b=3+2=5,相當於在判斷「5==0」,依次類推即可。
27樓:匿名使用者
符號的優先順序是:
在這個算式中是++最高
++是2級,其次==是7級(先左後右),最後是+=是14級這裡單指加了以後的賦值(先右後左)
然後關於==我做了個小驗證,
#include
int main(void)
結果是a為0,b為3。說明在用==(等於)的時候不像=(賦值)完全改變了賦值物件的值只是單次的改變一次物件的值。
例如你的a=1,b=2
計算順序是先b做自加1操作這時b才變為3,然後做b==0,如上的小驗證,做了這個運算後不會改變b的值(這是b裡面的值還是3)只是在參加運算的時候b單次變為0,,然後做a+=b(這裡的b為0)故這時候a還為1。所以執行這個語句以後a=1,b=3。
以上只是自己個人的觀點,不一定對但還是希望能幫到你。
參考資料字元優先順序表)
c語言中「0」到底是不是空格,C語言在中,空格是 0 的標誌嗎
充實生活 肯定不是空格啊,那個是個顯示不出來的字元,使用來做字串結束標誌的,ascii 碼裡面好多都顯示不出來的字元,列印出來應該都是這個效果的啊。 金色潛鳥 c語言中 0 不是空格,是空字串。0 是字元常量,null 字元,ascii碼數值0,用作字串結尾符。0 是字串,裡面有一個寫入的字串結尾符...
c語言中!10的值為0,為什麼,c語言中a 1 0 的值是什麼
ch陳先生 計算機記憶體儲存的時候認為規定了,只有0,沒有 0。c語言是一門程序導向的 抽象化的通用程式設計語言,廣泛應用於底層開發。c語言之所以命名為c,是因為c語言源自kenthompson發明的b語言,而b語言則源自bcpl語言。1967年,劍橋大學的martinrichards對cpl語言進...
c語言中 e什麼意思,c語言中,E! 0和!E 0各是什麼意思
宦泰然公靖 c語言 e的意思是 以指數形式輸出實數。指標的值是語言實現 編譯程式 相關的,但幾乎所有實現中,指標的值都是一個表示地址空間中某個儲存器單元的整數。printf函式族中對於 p一般以十六進位制整數方式輸出指標的值,附加字首0x。示例 inti 1 printf p i 相當於inti 1...