C 語言 為什麼 a>b 不要寫成 a-b>0 的情況

2022-01-02 我在BAT

收錄於話題 #c語言 149個

如果閱讀了上一篇:

C 語言, 什麼 char c = 0xFFFF 返回 -1?  那麼這個題目就非常好理解了!

(因為C語言裡面數據類型表示的數據是有範圍限制的)

舉一個簡單的例子:

int  c = INT_MAX;   

int  b = -1;

那麼有    c > b 是成立的!

但是當  

c - b > 0 的時候    是不成立的,因為 c-b  變成了一個負數了!


int main(){ int c = INT_MAX; int b = -1; if (c > b) { printf("%d > %d\n", c, b); } else { printf("%d < %d\n", c, b); }
if (c-b > 0) { printf("%d - %d > 0\n", c, b); } else { printf("%d - %d < 0 \n", c, b); } printf("%d - %d = %d\n", c, b, c-b); getchar(); return 0;}

  編譯運行如下:

這個問題,常見於二分查找的時候的運用! 計算 mid 的時候容易錯誤的使用加法導致溢出

相關焦點

  • 快速冪(C語言實現)詳細解讀
    在網站上一直沒有找到有關於快速冪算法的一個詳細的描述和解釋,這裡,我給出快速冪算法的完整解釋,用的是C語言,不同語言的讀者只好換個位啦
  • 為什麼程式語言中數組的下標總是從0開始?
    昨天看到一個有意思的問題,為什麼在我們遇到的大多數程式語言裡面,數組的下標基本都是從0開始?
  • C語言——文件的基本操作
    C語言基礎合集,點我點我~~~C語言進階合集,點我點我~~~C語言高級:01.C語言實現字符串的加密和解密02.C語言數據結構——鍊表C語言中規定該結構體類型為FILE型。, "wb+", "w+b", "ab+", "a+b"如果要以只讀方式打開文件名為test.txt的文本文件,應寫成如下形式:
  • C語言簡明教程(二)數據類型
    不能寫成 'ab'、'12'。字符常量只能是一個字符,不包括單引號。轉義字符:除了以上形式的字符常量外,C 語言還允許用一種特殊形式的字符常量,就是以字符 \ 開頭的字符序列,比如我們本節課的 3-1.c 中,\n 代表的就是換行符,顯示跳轉到下一行。這是一種在屏幕上無法顯示的「控制字符」。
  • Fluent UDF【4】:C語言
    字符型,如』a』,』b』,』c』等。Fluent UDF中還有real型,其實這是Fluent自定義的數據類型,在雙精度求解器中,real類型與double類型相同,而在單精度求解器中,real類型等同於float類型。UDF自動進行轉換,因此在需要浮點數時,可以全部採用real類型。3 常數在C語言中可以利用#define來定義常數。
  • C語言if else語句
    \n");由於if else 語句可以根據不同的情況執行不同的代碼,所以也叫分支結構或選擇結構,上面的代碼中,就有兩個分支。("This is a control character\n");else if(c>='0'&&c<='9')printf("This is a digit\n");else if(c>='A'&&c<='Z')printf("This is a capital letter\n");
  • C語言學習——輸入檢測
    無論哪種情況都是我們不想看到的。因此我們需要檢測輸入是否正確,若不正確則讓用戶重新輸入。與一位學過c語言的同學聊天時提到這件事,他告訴我scanf函數是有返回值的,返回成功讀取到的按指定格式輸入變量的個數。
  • c語言筆記
    如果用scanf_s() 把字符串讀入字符數組中,不要使用&。 C語言為處理數據提供了大量的操作,可以在程序中進行算術運算、比較值的大小、修改變量、邏輯地組合關係等。 while 原理:當程序第一次到達while循環時,會檢查圓括號中的條件是否為真。
  • 從零開始的C語言學習生活|W2 表達式
    c=(a+b)/2.0;//使得整型除後得到正確的數,避免5/2=2的操作printf(「%d和%d的平均值=%f\n」,a,b,c);當然,我們看到程序中c=(a+b)/2.0是有括號的,說明運算符也有它們的優先級
  • C語言宏定義#define的理解與資料整理
    所以,我奉勸你代碼裡一定不要出現「魔鬼數」。(這裡是從代碼可讀性的角度進行考慮!)但是我們利用define來定義數值類型的數據,一般只是用來定義  常量 ,如果 要定義一些變量,則可以使用c語言中const這個關鍵字。我們已經討論了const 這個關鍵字,我們知道const 修飾的數據是有類型的,而define 宏定義的數據沒有類型。
  • C語言高級部分總結
    1.2、c語言中其實沒有bool類型:以0表示假,非0表示真,則在內存存儲是以int型存放的。舉例子1: int a=3 ,b,c;b=a;c=b;那麼編譯器會優化成 c=b=a=3; 如果此時遇到上述三種情況,突然改變了a的值,那麼,對於沒有優化前是對的,但是對於優化後,那麼c仍然是3,就會出錯。所以當我們程式設計師知道這個變量會發生改變時,就應該加 volatile,提示編譯器不要幫我們做優化。
  • C 語言基礎
    常用基本類型short(短整型)、int(整型)、long(長整型)float(單精度浮點型,一般情況使用 float。)、double(雙精度浮點型,精度高,適用於科學計算等。), a*b=125.000000 (float 類型)    printf("a+b=%f\n,a*b=%f\n",a+b,a*b);        char c = 'a';    // 列印結果;c=f(c 為字符 a,c 加數字可以變為另一個字符,c+1=b,c+2=c,...)
  • NumPy 廣播機制與 C 語言擴展
    最簡單情況就是,兩個具有完全相同 shape 的數組運算,如下面例子所示,a = np.array([1.0, 2.0, 3.0])b = np.array([2.0, 2.0, 2.0])a * bnumpy 的廣播機制是指在執行算術運算時處理不同 shape 的數組的方式。
  • c語言面試題----printf()的參數
    intmain(void) {     int a = 10, b = 20, c = 30;     printf("\n %d..%d..%d \n", a+b+c,(b = b*2), (c = c*2));      return 0; }本題解析答:輸出結果是:110..40..60這道題目來說的話,許多同學感覺無從下手,所以沒法回答。
  • C語言代碼中 extern "C"的前世今生
    但此時,如果你重新編譯my_handle.c,C語言編譯器將會報告「語法錯誤」,因為extern"C"是C++的語法,C語言編譯器不認識它。此時,可以按照我們之前已經討論的,使用宏__cplusplus來識別C和C++編譯器。修改後的my_handle.h的代碼如下:
  • 計算機為什麼要從0開始計數?
    -- 梵谷眾所周知,計算機是從0開始計數,而不是我們平時常用的從1開始計數,但你有想過為什麼嗎?其實不是計算機從0開始計數而是多數程式語言中的數組都使用0作為起始下標,又是為什麼呢?這個問題超綱了,程序喵不會,但是本著對科學的敬畏之心,經過大量的搜索查證,我終於找到了答案。
  • 測試C語言水平的十道題,你敢挑戰嗎?
    5.使用_exit退出問:在下面的代碼中,atexit()並沒有被調用,為什麼?為什麼?#include<stdio.h> int main(void){ char *ptr = "Linux"; printf("\n [%c] \n",*ptr++); printf("\n [%c] \n",*ptr);return 0; }答:輸出結果應該是這樣:
  • 大一上c語言學習總結
    (1)main()----在c語言中稱之為「主函數」,一個c程序有且僅有一個main函數,任何一個c程序總是從main函數開始執行,main函數後面的一對圓括號不能省略。3/2.0的結果就是0.5 「%」符號請一定要注意是餘數,考試最容易算成了除號。)%符號兩邊要求是整數。不是整數就錯了。(9)   ++a:先加1,再運算,a++:先運算,再加1。考試口訣:++在前先加後用,++在後先用後加。 如:a++,++a(10) 注意:int(a+b) 和(int)a+b 的區別。 前是把a+b轉型,後是把a轉型再加b。
  • 面試大全 | C語言高級部分總結
    1.2、c語言中其實沒有bool類型:以0表示假,非0表示真,則在內存存儲是以int型存放的。舉例子1:int a=3 ,b,c;b=a;c=b;那麼編譯器會優化成 c=b=a=3; 如果此時遇到上述三種情況,突然改變了a的值,那麼,對於沒有優化前是對的,但是對於優化後,那麼c仍然是3,就會出錯。所以當我們程式設計師知道這個變量會發生改變時,就應該加 volatile,提示編譯器不要幫我們做優化。
  • 16個C語言經典問題(收藏)
    只有書呆子才會讀C語言課本的附錄去找出象這種問題的答案。當然如果你不是在找一個書呆子,那麼應試者最好希望自己不要知道答案。4. 嵌入式系統中經常要用到無限循環,你怎麼樣用C編寫死循環呢?這個問題用幾個解決方案。