在C語言中int a,b a 0 ba aaaprinrf a,b通過上機得知,b 7求告知,為什麼b會等於

時間 2021-08-14 06:07:21

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...