C中關於define的問題 那位能幫忙解答,謝謝

時間 2021-06-03 10:18:35

1樓:Larry Sean

這裡的編譯器優化,主要是將乘除法優化為了更快的位移操作和加減法。

首先看到x左移了4位,想到乘了16,下一句又減去乙個x,可以想到這裡的操作相當於

x = x * (16 - 1);

也就是M = 15。

下乙個if語句比較可疑,為什麼只在小於0的時候才處理呢?

先跳過,看到最後一句右移兩位,想到就是 y / 4.

這時考慮除不盡的情況應該向零取整,如果機器使用了算數右移,結果會向負無窮取整。正數滿足向零取整,而負數就不對了,因此,對於所有的負數加3修正,就得到了向零取整的結果。

因此,最後的結果是 M = 15, N = 4

並且可以推斷這台機器使用的是算數右移(因為C++中對於負數的右移的具體行為是根據實現決定的

(所以推斷沒什麼用:不推薦對有符號型別使用位操作符。

補充:C++11標準才規定了除法一定要向零取整,如果是之前的C++版本編譯要根據實現來。我也是看到+3修正才判斷是修正向零取整這個原因的。

// 儘管題目裡問的是C,我還是強行寫了C++標準。。因為C的標準我還沒看過,就不說了。有點遺憾

關於c 類中的this問題,成員函式過載

薛丁格的貓 我覺得你可能有一點沒搞清楚 this應為Screen const,為一常量指標,所指位址不能改變 位址確實是不可變的,但是指標指向的內容並不是常量,this表示的是指標指向的內容,應該是可以修改的。你可以從這一方面理解一下。 C primer這附近似乎是表述有誤 By default,t...

關於 C 中模板的顯示實參的匹配順序問題?

莊嚴 template classT2,class T3 T3f T1a,T2b 然後 f 3L 4 此時,double 和 3L同時試圖指定T1 的型別 然後,按照規定,顯式指定勝出,也就是 double勝出,long 失敗。所以傳入3L實際被轉換為double。可以這樣證明 include in...

關於C中的符號 ?

時夢 int p 4 array 這裡 p是指向陣列的指標,所以在使用時要加兩個 如果想要把p定義為陣列應該用 int p 4 array 此時可以直接用 p 1 2 效果等價於 p 1 2 ps 有一點需要注意的是 在C和C 裡,對指標變數的宣告 和 都是識別符號的一部分 我曾經在這裡暈了好久 屠...