為什麼在 C 語言中,i 1 i i i i i 得到 i 的結果是 15 而不是 14 ?

時間 2021-05-12 05:28:06

1樓:

程式要有可維護性!

程式的可維護性很重要!

程式的可維護性很重要!

程式的可維護性很重要!

程式的可維護性很重要!

程式的可維護性很重要!

2樓:布客飛龍

未定義的行為編譯器愛怎麼實現就怎麼實現,它沒有給你出彩蛋就夠「仁慈」了。

本來自增自減運算子和其他運算子混用就是不提倡的,你居然還一下用了好幾個。唉。

3樓:

使用gcc -S test6.c

test6.c結果為2

#include

int main()

彙編中不同的部分

call ___main

movl $1, 28(%esp)

addl $1, 28(%esp)

movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)

call _printf

test7.c結果為6

#include

int main()

彙編中不同的部分

call ___main

movl $1, 28(%esp)

addl $1, 28(%esp)

addl $1, 28(%esp)

movl 28(%esp), %eaxaddl %eax, %eax

movl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)

call _printf

再來看test8.c

#include

int main()

彙編中不同的部分

call ___main

movl $1, 28(%esp)

addl $1, 28(%esp)

addl $1, 28(%esp)

movl 28(%esp), %eaxaddl %eax, %eax

addl $1, 28(%esp)

addl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)

call _printf

我也看不懂pc的彙編,以前大學有用過點51微控制器的彙編,猜的話mov 和 add的功能應該差不多,比較了一下上面3個,發現test6是正常的1+1,test7被優化成了i=1;i++;i++;i=i+i=3+3,其實就是兩個++都做完後變成了3,然後再3+3, 最後看test8,這回有意思的來了,前兩個++仍然被做成了3+3,後面第三個++居然按正常的順序來了,成了4,如果你後面還有第4個++,第5個++,這些都能按正常從左往右的順序每次加1再加到總和裡,只有頭兩個++一定是同時加完的。

這應該是說明了gcc編譯中同級運算的順序有時並不一定和我們四則一樣從左往右吧。我挺討厭++運算子的。

4樓:

看到這種問題,就覺得譚某人可以死一死了,這樣的問題完全和編譯器的實現相關,實際中不會出現,也沒有任何意義。如果你是新手,又不是為了考試的話,完全可以不知道這種東西。

5樓:zhou y

看了這麼多沒看到有用的

c++裡面表示式求值雖然有運算子優先順序

但是求值順序是是不明確的

例如:int i = f1( ) * f2( );

我們知道f1 和 f2 一定會在乘法之前被呼叫 , 但是我們無法知道f1 和 f2 誰先呼叫,和編譯器有關。

所以上面的表示式再不同的編譯器上有不同答案。

以上來自c++primer第5版第123頁

6樓:

計算機系學生表示無語……學物理的同學經常會問我諸如此類的問題,沒法解釋,有的還有明顯錯誤,像譚某書上什麼乙個tab7個位元組之類的……這種牛角尖行為個人覺得毫無意義,有點為了應試而應試的感覺

在C語言中什麼意思?

男兒本色 在C語言中代表的是取位址符。scanf d a 這代表的是像a這個變數中輸入乙個整型數,我們知道,計算機的資料是放在電腦的儲存單元中的,在變數被建立的時候,在儲存器中就被分配了一定的儲存空間,這時我們在給這個變數賦值的時候就是往這個儲存空間中放數值,也就是直接將數值寫到這個空間中,a就代表...

為什麼c語言中 3 4等於0而不是 1?

冒泡 標準規定的,整數型別的除法結果是整數,向0的方向取整 3 4 0.75,往0的方向第乙個整數就是0,所以取0C早期並不是這樣做的,那時候這個行為是implementation defined,後面在C99才確定下來 其他語言也不一定是這樣,比如Python就規定向負無窮的方向取整 白板板同學 ...

在c語言中, c與 s有什麼區別呢?

C語言格式化描述字串中的 在scanf和printf中有不同的含義。在scanf中的含義是忽略掉這個匹配的輸入,例如 scanf d d a 讀取輸入 1 2 那麼a的值是2,第乙個 d對應的1就被丟棄掉了。在printf中,d將和引數列表中的兩個引數對應,第乙個引數為輸出長度。例如printf d...