推 adddream:感謝 ^^ 02/25 21:28
※ 引述《invalid (everlasting)》之銘言:
: ※ 引述《adddream (哆啦A孟)》之銘言:
: : 了解
: : 真是太感謝您囉
: : 不過想再追問一下
: : (1)為捨'\0'是表示false阿
: 更精確一點,在C/C++及一些其他語言中
: 'x'代表的型態是int (不是char*)
: 所以應該要說"\0"比較適當一點
: "\0"的意思就是使該字元的ascii code值為\後面的數字
: C/C++中也有一些方便記憶的序列,例如\n,\r,\b...
: 最早的C是沒有boolean的型別的
: 所以用int來代表真假
: 0為假,非0為真
我剛才查了一下C的規格書--ISO 9899:1999。
如果我沒會錯意的話:
『""』包起來的東西是一個array of character type,
它會傳給lvalue一個address(也就是它的rvalue),
所以一般來說"\0"不等於0。
可以用這個程式碼來測試把"\0"傳回的東西當作指標運算,應該會印出0:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <stdio.h>
int main()
{
int a = (int) "\0";
char c = *((char *) a);
printf("%d", c);
return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
換言之使用『""』建立字串時,程式會先在記憶體中配製一塊空間給該字串(字元陣列)。
並把第一個字元的位址傳給lvalue。
(以上部份是我參考規格書的想法,如有會錯意請見諒,我不是C語言高手。)
而'\0'應該為0,雖然我在C規格書查不到。不過可以測試這個程式碼:
if('\0' == 0) printf("Yes.\n");
另外我還查到規格書說『false』會被macro expands to 0,
『false』被定義在stdbool.h裡面。
: : (2)還有就是通常在陣列裡頭結尾(不管是指哪種陣列)不都是會加上'\0'嗎?
: : 還是說是我記錯了@@'
: 這只有C-like string才是這樣
: 這只是為了方便以最小的記憶體操作字串的技巧
: 你高興自創一個不用\0的string也可以
: 只是就不能用string.h裡面的函式啦
: 另外"\0"可以想成是signature,通常用來代表特定區塊的邊界
: 譬如說FAT32分割區中會以0xAA55代表分割區的開始
: 要注意的就是通常只有"文字"資料才會"只"利用signature來切割
: (FAT32其實還有其他欄位去進行辨認)
: 如果你的資料是binary形式的
: 通常就會使用類似HTTP協定加註資料長度的方式來辨別區塊的邊界
: 要不然就要使用strip的方式,將衝突的signature先替換掉
--
《金剛經》
離一切諸相,則名諸佛。
http://web.cc.ncu.edu.tw/~93501025/jg.doc
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.201.94
※ 編輯: zxvc 來自: 140.115.201.94 (02/25 20:04)
※ 編輯: zxvc 來自: 140.115.201.94 (02/25 20:05)