請問 C++中為何 NULL與負數比較後 NULL比較大?

請問 C++中為何 NULL與負數比較後 NULL比較大?

我寫了一段簡單的程式碼判斷如下

int aa[4]={NULL,-3,-236,-50};

int max=-99999;

for (int ii=0;ii<4;ii++)

{

cout<<aa[ii]<<",";

if (max<aa[ii]){max=aa[ii];}

}

cout<<endl<<max<<endl;

但結果為0

理論上,NULL應該是沒有東西

也就是說aa[0]裡面應該沒有任何東西

所以應該不能夠做比較

為何其經過比較後是上面4個數最大的

且顯示為0?

Update:

to ..Jacob Lee

那再請問

當我的程式要判斷某陣列是否所有的元素皆為NULL的話(亦即該陣列為空集合)

放0在元素中會容易被混淆這是必然的吧?

因我在研究如何寫車輛途程問題(VRP)的演算法

其中需要將某些陣列元素設為NULL以判斷該節點是否已經被選過

若以我的想法 原問題中陣列 aa印出來應為{ ,-3,-236,-50}

aa[0]是沒有任何東西的

可是實際執行後印出來卻是{0,-3,-236,-50}

不過話說回來 這是C/C++本身的設定 它要丟0進去我們也莫可奈何吧

Update 2:

to Jacob Lee

是的

我所要使用的陣列當中確實有負數存在(但不是路徑距離而是節約值)

而您建議的INT_MIN確實是可以解決我的問題

萬分感謝~~!!

5 Answers

Rating
  • 1 decade ago
    Favorite Answer

    NULL 本身就是個 0

    只是在不同的情況下,它可能會是 1, 2, 4, 8 等 2^n 個 bytes 的 0

    所以,0 大於負數,是正常 且 正確的。

    2008-01-08 00:57:58 補充:

    沒人回答,我臉皮就厚一點來回答。

    免得你一題懸在那麻煩。

    也希望你不要讓我懸在那,一直回來看。

    NULL 的英文字是〝沒有東西〞;

    但在 C/C++ ,NULL 在不同的情況下會對應到不同 2n bytes 數的 0。

    (如我在意見裡所寫的。)

    簡言之,NULL 就是 0。

    所以,你的 aa[0] 存的就是 0。

    NULL pointer 是個指向位址 0 的指標。

    是特定為空指標的位址!

    0x00...00 那個 RAM 裡也有資料!

    不過,(現代的)系統會把它保護好。

    所以,就看你是用 int *a = NULL,它也是一個 0!

    所以,你程式裡最大的數是 aa[0] 裡的 NULL,就是 0!

    沒錯!

    圖片參考:http://tw.yimg.com/i/tw/blog/rte/smiley_1.gif

    2008-01-08 10:12:12 補充:

    你若要做空集合,只有你自己去定義了!

    若是路程沒有負數,你可以用負數去代表空集合。

    至於你在意見裡問的 NULL 和 0 有沒有差別?

    除了 sizeof(NULL) sizeof(0) (沒試過,你自己試試)

    可能會得到不同的答案外,

    0 就是 0,沒差別。

    (尤其是:它們都是整數 0。)

    2008-01-08 10:14:36 補充:

    看來你的有負數!

    那,較好的招數〝可能〞只剩一個:定一個用不到的數值!

    如:INT_MIN。

    2008-01-08 10:34:12 補充:

    NULL

    在字元是 0

    在數值是 0

    在 pointer 是最低的 RAM 的位置,〝通常〞是 0

    在設備是虛擬的空設備,是個常度不是 0 的檔案或程式碼

    ...

    版大問的是 數值 NULL,它是不折不扣的 0

    版大問的不是 NULL pointer、NULL device、NULL ...

    字串不一定是 NULL terminated!

    不過,C 規定字串是 NULL terminated!

    也就是說:C 字串結尾符號並不是'\0',而是數值 NULL!

    2008-01-08 10:35:21 補充:

    另外,回答時順便提到的:NULL 字義為空,

    所以,在〝數值〞的對應上,不太可能變為不是 0!

    就像我在美國上課時問教授:為什麼 stack 都是由下往上,不由上往下?

    全班爆笑!

    連那位不〝狗〞言笑的教授都笑了!

    我會那樣問,是因為:我不知道 stack 的字義是什麼!

    只知道它在電腦是什麼!

    2008-01-10 01:49:36 補充:

    http://en.wikipedia.org/wiki/C_string: "a C string is a character sequence stored as a one-dimensional character array and terminated with a null character ('\0', called NUL in ASCII)."

    2008-01-10 01:50:32 補充:

    http://en.wikipedia.org/wiki/Null_character: "The character has special significance in C and its derivatives, where it serves as a reserved character used to signify the end of strings. The null character is often represented as the escape sequence '\0' in source code. ...

    2008-01-10 01:50:50 補充:

    http://en.wikipedia.org/wiki/Null_character: "...Strings ending in a null character are said to be null-terminated."

    2008-01-10 01:58:12 補充:

    Stack 字義是堆成疊。

    在地球上,能從上往下堆?

    Apple ][ 用 6502 當 CPU,它們的 硬體配有 stack,在 0x0100 ~ 0x01FF。

    那是專用的。

    6502 的 Stack 是由 FF 用到 00

    一般程式不會去用 0x0100 ~ 0x01FF 這塊 RAM

    在 IBM 相容電腦,Heap 和 Stack(0) 的 Stack(1) 雖然同名,但不等於 stack (0) 就是 Stack(1)

    在使用上,CPU 的 SS 還是要去設好它的位置。

    設錯,和 DS 打架....

    2008-01-10 02:00:08 補充:

    所以,Stack 的名稱與習慣,應該是:

    先人因為 這結構的特性(FILO)找到 STACK 這東西合用

    →選用 Stack 做名字

    →大家學了這結構與名字

    →習慣這麼設計

    • Login to reply the answers
  • Dave
    Lv 7
    1 decade ago

    事實上,空集合跟一個集合裡面有 0 (或 null) 兩個還是不一樣的…

    {} 是空集合,集合裡沒半個東西… 集合大小為 0

    {0} "不是" 空集合,集合裡有一個東西,叫作 "0"… 集合大小為 1

    {null} 一樣不是空集合,集合裡有個東西叫作 null…

    又因為 C 裡的 null character 是 0,要是你的集合裡需要包含 0 這個數字,最好的方法還是像解答裡說的,設一個在集合中不合法的數字當作一個 marker,當要把集合中的一個數字刪除,就把那個位置設為你的 marker 就好…

    2008-01-11 05:53:54 補充:

    我倒是覺得 jacob 你問為何 stack 是從下向上長的,你們全班會暴笑,要不是你們班的程度還不到那個程度,要不就是問問題的時間不太好… 因為很多人學程式設計到最後也會問這些比較 implementation specific 的問題… 而我也覺得了解這些問題跟當初設計 (或只是巧合) 的歷史是滿好玩的… (例:為何 C 的 index 是從 0 開始的)

    • Login to reply the answers
  • 1 decade ago

    是的

    喵喵咪能夠了解我的想法

    如果NULL是0 而0也是0

    那麼這兩者有何區別呢?

    當我的程式要判斷某陣列是否所有的元素皆為NULL的話(亦即該陣列為空集合)

    放0在元素中會容易被混淆

    因我在研究如何寫車輛途程問題(VRP)的演算法

    其中需要將某些陣列元素設為NULL以判斷該節點是否已經被選過

    若以我的想法 原問題中陣列 aa印出來應為{ ,-3,-236,-50}

    aa[0]是沒有任何東西的

    可是實際執行後印出來卻是{0,-3,-236,-50}

    不過話說回來 這是C/C++本身的設定 它要丟0進去我們也莫可奈何吧

    • Login to reply the answers
  • SiYu
    Lv 5
    1 decade ago

    joy 那如果要把0 放到集合中怎麼辦.

    不能把array 中的element 都當作是0 就是不存在阿.

    這樣子. 就無法表示空的array. 或是表示空集合.

    令外給Jacob lee

    NULL 就是NULL 你管它原本表示的是什麼.是0 也好是1也好

    NULL 還是NULL 因為有可能別的系統不一定用0 表示NULL.

    只是目前大部份的系統都是用0 表示罷了.

    另外C 的字串結尾符號並不是NULL . 是'\0' 這真的是0. 且是大家都約定如此的.

    2008-01-09 15:25:35 補充:

    http://en.wikipedia.org/wiki/C_string

    wiki 上寫的c string

    他的結尾字元是 '\0' 不是NULL

    http://en.wikipedia.org/wiki/Null_character

    這篇還有針對Null character 介紹 .

    以前我也是對c 的字串結尾符號當作是NULL

    後來. 發現. 這是不一樣的東西. 用 '\0' 比用NULL 正確多了.

    2008-01-09 15:47:30 補充:

    stack 由高位addres 往低位address 長. 我的看法

    http://jsliu.no-ip.info/phpbb2/viewtopic.php?p=153

    • Login to reply the answers
  • How do you think about the answers? You can sign in to vote the answer.
  • joy
    Lv 5
    1 decade ago

    恩 沒錯阿!??? 空集合就是都零阿

    • Login to reply the answers
Still have questions? Get your answers by asking now.