1. 程式人生 > >探索C語言中單引號與雙引號的區別

探索C語言中單引號與雙引號的區別

今天看了《C陷阱與缺陷》中對””與’’的描述,’’引起的一個字元代表一個整數,整數值對應於該字元在編譯器採用的字符集中的序列值;””引起的字串代表的是一個指向無名陣列起始字元的指標。對這兩個符號產生了興趣,遂開啟VS2010查看了單引號、雙引號引起的字元在記憶體中的儲存形式。

實驗方式很簡單,分別檢視”yes”/’yes’/’ye’/’y’四種字元在記憶體中的儲存形式,程式碼如下:

int _tmain(int argc, _TCHAR* argv[])

{

char test1[] = "yes";

int test2 = 'yes';

printf("%x\n", &test2);

int

 test3 = 'ye';

printf("%x\n", &test3);

int test4 = 'y';

printf("%x\n", &test4);

return 0;

}

實驗結果如下:

 

根據記憶體中的儲存形式,發現’’引起的字串按照整數的儲存形式,將第一個字元識別為最高位,最後一個字元識別為最低位,按此順序存入int變數4個位元組的儲存空間中;””引起的變數按照第一個字元儲存在起始地址處,最後一個字元儲存在結束地址處。實驗的結果證實了《C陷阱與缺陷》中的描述,那麼當’’引起的字元超過4個位元組時會出現什麼情況呢?再進行一次實驗,程式碼如下:

int _tmain(int

 argc, _TCHAR* argv[])

{

char test1[] = "yes";

int test2 = 'yes';

printf("%x\n", &test2);

int test3 = 'ye';

printf("%x\n", &test3);

int test4 = 'y';

printf("%x\n", &test4);

int test5 = 'yesa';

printf("%x\n", &test5);

return 0;

}

實驗結果如下:

 

根據實驗結果可以看到字元超過4個位元組,超出了int型儲存能力,編譯器報錯,提示常量字元太多。這樣可以有效提醒給程式猿同學,有可能存在符號輸入錯誤,但是沒有超過

int型儲存能力時照單全收,沒有任何提示,存在著符號誤用的隱患,以後程式出現問題除錯會相當麻煩。

相關推薦

探索C語言引號引號區別

今天看了《C陷阱與缺陷》中對””與’’的描述,’’引起的一個字元代表一個整數,整數值對應於該字元在編譯器採用的字符集中的序列值;””引起的字串代表的是一個指向無名陣列起始字元的指標。對這兩個符號產生了興趣,遂開啟VS2010查看了單引號、雙引號引起的字元在記憶體中的儲存形式

C#語言數組集合的區別(以List集合為例)

類型 添加元素 list 添加 一個 保存 操作方法 適用於 length 數組用於保存固定數量的數據,定長,占用內存少,遍歷速度快; 集合保存的數據數量,可以在程序的執行過程中,不斷發生變化,不定長,占用內存多,遍歷速度慢; 在功能上,數組能實現的所有功能,集合都能實現;

c語言陣列名指標的區別聯絡

今天在工作中定義陣列的時候習慣性的使用char型指標後直接等於字串,但在編譯通過後執行的時候產生了段錯誤,因為著急就(整個函式程式碼還是比較多的)沒仔細看程式碼,只是抱著試試看的心態,將定義換成了陣列後等於字串的形式,居然沒有在出現段錯誤,感到很奇怪(剛乾程式設計師沒多久,

C語言引號引號區別

拿0來舉例: 單引號是單個字元‘0’; 雙引號是字串“0”,包含0和結束符 , 即‘0’‘\0’ 組成的有一個字元0和結束符組成的字串。 雙引號裡面的是字串,代表的卻是一個指向無名陣列起始字元的指標,該陣列被雙引號之間的字元以及一個額外的二進位制值為零的字元‘\0’初始化

C語言引號引號

C語言中的單引號和雙引號含義不一樣的。 1、含義不同。 用單引號引起的一個字元實際上代表一個整數,整數值對應於該字元在編譯器採用的字符集中的序列值。而一般我們的編譯器採用的都是ASCII字符集。因此's'的含義其實和十進位制數115的含義是一致的。 而用雙引號引起的

機房收費系統之收取金額查詢(TPicker控制元件時間段取值、SQL語句引號引號區別

        收取金額查詢窗體較組合查詢而言就是小菜一碟,但即便是內容較少也有其精華之處,現在分享一下我的學習過程吧^_^ 一、收取金額查詢窗體的流程圖: 二、問題集 這是什麼錯誤呢,為什麼會出現這個型別的錯誤? 產生此問題的程式碼部分是什麼樣子的呢? 以

Js引號引號

單引號和雙引號其實沒啥區別,看你自己習慣了 <input type="button" onclick="alert("1")">-------------------不正確 <input type="button" onclick="alert('1')

Js引號引號問題

2.單引號包含雙引號的時候,裡面的雙引號不用轉義,反之亦然 看下面程式碼: <input type="button" onclick="alert("3")">-------------------不正確 <input type="button" onclick="alert('3')"

SQL引號引號區別

當 SET QUOTED_IDENTIFIER 為 ON 時,識別符號可以由雙引號分隔,而文字必須由單引號分隔。當 SET QUOTED_IDENTIFIER 為 OFF 時,識別符號不可加引號,且必須符合所有 Transact-SQL 識別符號規則。有關詳細資訊,請參閱識別符號。文字可以由單引號或雙引號分

java引號引號區別?hashcode()和equals()

單引號引的資料 是char型別的 雙引號引的資料 是String型別的 單引號只能引一個字元 而雙引號可以引0個及其以上 hashcode這個方法是用來鑑定2個物件是否相等的。 一般來講,equals這個方法是給使用者呼叫的,如果你想判斷2個物件是否相

C# 的單精度精度區別

數字 字節數 1.7 oat 處理 round col ble 浮點 單精度浮點數(float)與雙精度浮點數(double)的區別: (1)在內存中占有的字節數不同 * 單精度浮點數在機內占4個字節 *雙精度浮點數在機內占8個字節 (2)有效數字位數不同 *單精度浮點數有

CC語言的_exit()exit()

_exit()和exit()主要區別是一個退出程序會清理I/O緩衝區,一個直接結束程序進入到核心中。 舉例說明: 1 #include <stdio.h> 2 3 4 /*demo01 程式只輸出 hello world*/ 5 /* 6 int main() 7

C語言負數除法右移取整問題

今天碰到了負數除法與右移的替代問題,藉機研究一下C語言中負數除法的問題。此處只討論整數除2的冪次方的情況,並取-7~-5除以4為例,不討論一般除法的移位優化。 負數右移 對於有符號整數,右移時按高位補符號位的原則,則結果會向小於它的整數取整。如 -5 >

PHP echo 引號引號區別

PHP中使用echo輸出字串時,使用單引號(' ‘)和雙引號(” “)都是可以的,比如: echo '測試變數在函式體外部的作用域</br>'; echo "測試變數在函式體外部的作

初學Linux(二)---Linux下C語言的陣列指標

初學Linux(二)—Linux下C語言中的陣列與指標 在經過階段一的linux學習之後,我來到了階段二的Linux下的C語言程式設計,雖然學到目前linux下的C語言似乎跟之前學的C語言所差無幾,但是按照老師的話來說,C語言指標這塊尤為重要,而我在這一方面的

淺談C語言文字檔案二進位制檔案

C語言中,按檔案中的資料組織形式來分,資料檔案可分為ASCII碼檔案(即文字檔案)和二進位制檔案。 文字檔案在磁碟中存放時每個字元對應一個位元組,用於存放對應的ASCII碼。 二進位制檔案把資料按其在記憶體中的儲存形式存放在磁碟上,一個位元組並不一定對應一個字元。 對於A

javascript的引號引號

   在JavaScript中單引號和雙引號區別不大,在表示字串中是完全等效的,如果在字串中存在單引號則外面就要用雙引號,如果字串中存在雙引號則在外面要用單引號括起來,這樣就不用轉義裡面的符號了, 不

C語言全域性變數靜態全域性變數區別

 全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。 這兩者在儲存方式上並無不同。這兩者的區別在於非靜態全域性變數的作用域是整個源程式, 當一個源程式由多個原始檔組成時,非靜態

C語言的二級指標(指標)

二級指標又叫雙指標。C語言中不存在引用,所以當你試圖改變一個指標的值的時候必須使用二級指標。C++中可以使用引用型別來實現。下面講解C中的二級指標的使用方法。例如我們使用指標來交換兩個整型變數的值。錯誤程式碼如下:一級指標#include <stdio.h> void swap(int *a,i

javascript字串引號引號區別

最近在使用javascript程式設計,遇到使用字串的情況 寫了一點測試程式碼 var str = 'This is Jack'; var str2 = "This is Tom"; var str3 = 'This is