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