今天偶爾碰到這麼乙個題目:已知c是字元型變數,下面不正確的賦值語句是:(b)
a. c=2+3; b. c= '2+3' c.c='\2'+3; d c='2'+'3'
很明顯,答案應該是b,因為該選項沒有出現分號,所以不能算乙個賦值語句。但是這就完事了嗎?
於是我就在ide當中就重新為c賦值『1234』,發現結果是'4',而如果我給c賦值『12345』,編譯器卻提示我字元常量中的字元過多。
這個提示引起了我的好奇:首先,為什麼字元常量不是字串也可以有『1234』這樣的值呢?其次,為什麼字元變數可以使用『1234』這樣的字元常量來賦值呢?第三,為什麼字元常量的長度只能是4個呢?經過若干次測試,我有了如下的猜測,由於沒有知識上的支援,所以先記錄出來吧,日後看看能否解答。
因為剛好是4個字元,而每乙個字元常量的應該都是8bits的,所以,4*8=32,剛好是int型別的長度。所以我就嘗試著把'0000'賦給乙個整形數,結果發現居然是可以的,並且,編譯器還提示了'0000'對應的int型別的數值是多少:
很明顯,這就是說把'0000'的四個'0',分別儲存到4個位元組的空間當中,(00110000)轉換成十進位制就是48,按照ascii 的規則,48剛好是字元'0'對應的十進位制數。即,'0000'可以用於整形數的賦值,並且本質上,應當可以把'0000'這個字元常量理解成為是乙個整形數。如果這麼一說,那問題就很好解決了:因為char型別和int型別其實是可以通過隱式或者顯式的方式進行型別轉換,並且int轉char就是把前3個高位元組的部分丟棄。
這樣就可以解釋,為什麼字元常量不是字串也可以有『1234』這樣的值呢?為什麼字元變數可以使用『1234』這樣的字元常量來賦值呢?為什麼字元常量的長度只能是4個呢?這3個問題了。猜想如下:由於可以把'0000'這樣的字元常量看做是int型別,而字元常量本身可以被int型別強制轉換,所以把'0000'這樣的「int型別資料」賦給字元常量的初值,那就說得過去了,只不過它就選擇了最低位元組的值而已。既然'0000'這種型別的字元常量本質上也可以看做是int型別的常量,那麼自然就不能夠超出int型別資料的長度,也就是4位元組了,所以最多就是4個字元了。
c語言字元陣列一些啟示
最近博主在學習 linux系統程式設計 所以想記下來學習的一些心得,與大家分享,也備以後回顧只用。第一天,就從我在今天學習過程遇到的問題寫起,博主今天在學習標準io庫,遇到乙個問題,關於字元指標的問題,如下 1 include2 include3 4 int main 5 15 s 0 16 pri...
C變數的一些細節
變數宣告向編譯器保證變數以指定的型別和名稱存在,這樣編譯器在不需要知道變數完整細節的情況下也能繼續進一步的編譯。變數宣告只在編譯時有它的意義,在程式連線時編譯器需要實際的變數宣告。變數的宣告有兩種情況 extern int i 宣告,不是定義 int i 宣告,也是定義一種是需要建立儲存空間的。例如...
關於字元變數的一些總結
char 表示的是乙個字元變數,可以按照這種方式定義 char ch1 a char 表示的是乙個字元型別指標,可以按照如下方式定義 char ch1 abcd 這裡ch1儲存的是該字串文字量的a的指標,實驗如下 include stdafx.h include using namespace st...