您好,登錄后才能下訂單哦!
這篇文章主要介紹“C語言各種符號如何使用”,在日常操作中,相信很多人在C語言各種符號如何使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C語言各種符號如何使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
為了更好的演示我們下面的代碼會在 Linux 平臺下演示( \ 為續行符):
這段代碼,哪一行是有問題的呢?
這里可能有小伙伴就有疑問了,為什么只有這一行出了問題呢?我們知道注釋在預處理階段就被編譯器識別出來了,這里我們可以用 Linux 的一個指令:gcc -E test.c -o test.i這樣就是對test.c 程序進行翻譯,最終把預處理的結果保留下來,接著就可以用 vim 打開我們的預處理結果文件了。
最終我們可以得出這樣一個結論:注釋被替換本質上是被替換成空格!
這里我們要再提一個簡單的點,C語言注釋無法被嵌套,/* 總是與最近的 */ 匹配,感興趣的小伙伴可以去測試下:
int main() { /* /*printf("hello world"); printf("hello world");*/ */ return 0; }
這里還有一個有趣的代碼,如果用C語言的注釋的話,如果只出現了一個 /* 找不到下面的 */ 的話,那么他就會默認下面所有代碼都被注釋!
int main() { int x = 10; int y = 5; int ret = 0; int* p = &y; ret = y/*p; return 0; }
那么如何解決上面這種情況呢?
在 / 與 * 中加上空格: ret = y / *p;
把 *p 用括號括起來: ret = y / (*p);
推薦第二種,因為看起來會更直觀
[ 建議1 ] 注釋應該準確易懂,不能有爭議性,錯誤的注釋反而有害。
[ 建議2 ] 要保證注釋與代碼的一致性,沒用的注釋及時刪除。
[ 建議3 ] 對于全局數據 (全局變量、常量定義)必須要加注釋。
[ 建議4 ] 一目了然的語句可以不加注釋,比如:i++; // i 自增1。
[ 建議5 ] 注釋的位置應與被描述的代碼相鄰,可以與語句同一行,不放在下方。
[ 建議6 ] 當代碼比較長,特別是有多重其那套時,應當在一些段落的結束處加注釋。
[ 建議7 ] 注釋的縮進要與代碼的縮進一致。
[ 建議8 ] 注釋代碼應當注重,“ 為何做 ” ,而不是 “ 怎么做 ”。
[ 建議9 ] 數值的單位一定要給上注釋。
[ 建議10 ] 復雜的函數中,在分支語句、循環語句結束之后需要適當的注釋,方便區分各個分支或循環體。
C語言里用反斜杠( \ )表示斷航。編譯器會將反斜杠剔除掉,跟在反斜杠后面的字符自動續接到前一行。但是注意:反斜杠之后不能有空格,感興趣的小伙伴可以下來測試下:
int main() { int a = 1; int b = 2; int c = 3; if (1 == a && \ 2 == b && \ 3 == c) { printf("You can see me!\n"); } else { printf("You can not see me!\n"); } return 0; }
可能有的小伙伴會好奇,明明我不用 \ 也可以換行不會報錯啊,那為什么還要用 \ 表示換行呢?我們作為一個程序員,別人可能也會去閱讀我們的代碼,如果不帶 \ 直接換行可能會出現奇異,在一個也可以告訴編譯器這個地方是續行,語義更強!
C語言中,有一些字符,就是他的字面意思,比如 'n','b','t'。 也有一些字符,本身就是特殊含義的,比如:" , ', \ 轉義的本質含義是:字面轉特殊,或者特殊轉字面。
\ 有兩種用途:
當續行符使用
轉義字符使用 (a. 字面轉特殊 b. 特殊轉字面)
這里我們重點講一下 \n 和 \r可能小伙伴們都聽過換行和回車吧!那么他們本質上的意思是不一樣的!但是現在很多編譯器讓換行( \n )里面也包含了回車( \r ) 的功能!那他們倆究竟有什么樣的區別呢?
換行:讓光標移動到下一行
回車:光標回到當前行的最開始
這里小伙伴可以試一下用C語言寫一個簡單的倒計時功能,就能很明顯的區分換行和回車的區別了!
這里我們也可以來看一道筆試題:
//以下程序輸出什么? #include <string.h> #include <stdio.h> int main() { printf("%d\n", strlen("abcdef")); // \62被解析成一個轉義字符 printf("%d\n", strlen("c:\test\628\test.c")); return 0; }
這里第一個打印函數,我們如果有了解,strlen() 函數是求字符串中 \0 之前的字符個數,所以第一個打印的是 6 , 第二個打印函數,首先是 \t 被解析成一個轉義字符, \62 也被解析成一個轉義字符 (8進制) 所以第二個打印的應該是 14 !
對于C語言有了解的小伙伴都知道,單引號引起來的都是字符常量,雙引號引起來的都是字符串常量,但其實對于初學者來說還是容易出錯,比如 'a',和 "a" 是完全不一樣的概念,在字符串中,以 \0 為結尾,他本質上不屬于字符串的元素內容,只能說他是字符串結束標識符,但是它會占用空間!也就是 'a' 會占一個字節而 "a",則會占兩個字節。
有了上面簡單的概念我們來看一個例子:
這里可能就有小伙伴有疑問了,前兩個和最后一個 printf打印結果我還能理解,可是第三個為啥是占四個字節呢?這明明不是一個字符常量嗎?(C++ 中第三個大小為 1 個字節,因為這里是講C語言所以我們不討論其他語言)
其實在 C99 標準的規定,'1' 叫做整型字符常量(integer character constant),被看成是 int 類型。
光是用 “ 標準規定 ” 用來證明是不可行的,我們再用一個實例來證明:
看到這個結果不要驚訝,我剛剛說過,標準規定,整型字符常量被看成是 int 類型,所以他會有四個字節的空間,而且我當前電腦是小端存儲,所以低字節序放在低地址處,在者,將一個4字節的數據放入 char 類型的變量中是會發生數據截斷的,會將低地址的一個字節內容放入 char 類型的變量中,所以其實最終 c 變量里放的只是一個 'd' 字符!
但是我不推薦上面這種寫法!!!我們明白其中道理就好。
那這里有的小伙伴又開始下去實驗了,于是寫出了這樣的代碼:
因為一個整型字符常量只有 4 個字節空間,他如何能放得下 5個字節甚至更多呢?
顯而易見,是不能出現空整型字符常量的,但是可以出現空字符串,因為字符串結束標識符 \0 雖然不能算字符串元素內容,但是它也是占大小的。
概念:級聯兩個(多個)邏輯表達式,必須同時為真,結果才為真。
例子:
對于邏輯與的短路現象,因為我們編譯器是從左往右掃描的,所以如果當表達式左邊為假的話,它就不會去執行邏輯與右邊的表達式,這也就是我們所稱的短路現象:
概念:級聯兩個(多個)邏輯表達式,必須至少一個為真,結果才為真。
例子:
上面這個例子同時也包含了邏輯或的短路現象,在邏輯或中,因為編譯器是從左往右掃描代碼的,所以只要表達式左邊為真,則不需要進行右邊的判斷。
因為對于前置++和后置++我還沒有講,所以有基礎的同學可以先看看,沒基礎的可以等我下期出了符號第二期在回來看這道題。
第一個邏輯與表達式,a 變量的初始值是 0 ,而且是后置++,先使用表達式的值,在進行自增,而邏輯與必須滿足表達式兩邊的值都為真,但凡有一個為假都不會執行后面的表達式,所以只有 a 變量發生了變化。第二個邏輯或表達式,邏輯或只要表達式兩邊有一個為真即可,a++ 判斷為假,會接著判斷 ++b, 前置++ 是先自增在使用,所以 ++b 表達式為真,也就不會去執行后面表達式了,也就是說,只有 a和b變量的值發生了變化。
到此,關于“C語言各種符號如何使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。