C語(yǔ)言各種符號(hào)的使用介紹上篇
1、注釋符號(hào)
1.1 注釋的基本注意事項(xiàng)
為了更好的演示我們下面的代碼會(huì)在 Linux 平臺(tái)下演示( \ 為續(xù)行符):

這段代碼,哪一行是有問(wèn)題的呢?

這里可能有小伙伴就有疑問(wèn)了,為什么只有這一行出了問(wèn)題呢?我們知道注釋在預(yù)處理階段就被編譯器識(shí)別出來(lái)了,這里我們可以用 Linux 的一個(gè)指令:gcc -E test.c -o test.i這樣就是對(duì)test.c 程序進(jìn)行翻譯,最終把預(yù)處理的結(jié)果保留下來(lái),接著就可以用 vim 打開我們的預(yù)處理結(jié)果文件了。

最終我們可以得出這樣一個(gè)結(jié)論:注釋被替換本質(zhì)上是被替換成空格!
這里我們要再提一個(gè)簡(jiǎn)單的點(diǎn),C語(yǔ)言注釋無(wú)法被嵌套,/* 總是與最近的 */ 匹配,感興趣的小伙伴可以去測(cè)試下:
int main()
{
/*
/*printf("hello world");
printf("hello world");*/
*/
return 0;
}這里還有一個(gè)有趣的代碼,如果用C語(yǔ)言的注釋的話,如果只出現(xiàn)了一個(gè) /* 找不到下面的 */ 的話,那么他就會(huì)默認(rèn)下面所有代碼都被注釋!
int main()
{
int x = 10;
int y = 5;
int ret = 0;
int* p = &y;
ret = y/*p;
return 0;
}那么如何解決上面這種情況呢?
在 / 與 * 中加上空格: ret = y / *p;
把 *p 用括號(hào)括起來(lái): ret = y / (*p);
推薦第二種,因?yàn)榭雌饋?lái)會(huì)更直觀
1.2 如何寫出好的注釋
[ 建議1 ] 注釋應(yīng)該準(zhǔn)確易懂,不能有爭(zhēng)議性,錯(cuò)誤的注釋反而有害。
[ 建議2 ] 要保證注釋與代碼的一致性,沒(méi)用的注釋及時(shí)刪除。
[ 建議3 ] 對(duì)于全局?jǐn)?shù)據(jù) (全局變量、常量定義)必須要加注釋。
[ 建議4 ] 一目了然的語(yǔ)句可以不加注釋,比如:i++; // i 自增1。
[ 建議5 ] 注釋的位置應(yīng)與被描述的代碼相鄰,可以與語(yǔ)句同一行,不放在下方。
[ 建議6 ] 當(dāng)代碼比較長(zhǎng),特別是有多重其那套時(shí),應(yīng)當(dāng)在一些段落的結(jié)束處加注釋。
[ 建議7 ] 注釋的縮進(jìn)要與代碼的縮進(jìn)一致。
[ 建議8 ] 注釋代碼應(yīng)當(dāng)注重,“ 為何做 ” ,而不是 “ 怎么做 ”。
[ 建議9 ] 數(shù)值的單位一定要給上注釋。
[ 建議10 ] 復(fù)雜的函數(shù)中,在分支語(yǔ)句、循環(huán)語(yǔ)句結(jié)束之后需要適當(dāng)?shù)淖⑨專奖銋^(qū)分各個(gè)分支或循環(huán)體。
2、接續(xù)符和轉(zhuǎn)移符
2.1 續(xù)行功能
C語(yǔ)言里用反斜杠( \ )表示斷航。編譯器會(huì)將反斜杠剔除掉,跟在反斜杠后面的字符自動(dòng)續(xù)接到前一行。但是注意:反斜杠之后不能有空格,感興趣的小伙伴可以下來(lái)測(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;
}可能有的小伙伴會(huì)好奇,明明我不用 \ 也可以換行不會(huì)報(bào)錯(cuò)啊,那為什么還要用 \ 表示換行呢?我們作為一個(gè)程序員,別人可能也會(huì)去閱讀我們的代碼,如果不帶 \ 直接換行可能會(huì)出現(xiàn)奇異,在一個(gè)也可以告訴編譯器這個(gè)地方是續(xù)行,語(yǔ)義更強(qiáng)!
2.2 轉(zhuǎn)義字符
C語(yǔ)言中,有一些字符,就是他的字面意思,比如 'n','b','t'。 也有一些字符,本身就是特殊含義的,比如:" , ', \ 轉(zhuǎn)義的本質(zhì)含義是:字面轉(zhuǎn)特殊,或者特殊轉(zhuǎn)字面。
\ 有兩種用途:
- 當(dāng)續(xù)行符使用
- 轉(zhuǎn)義字符使用 (a. 字面轉(zhuǎn)特殊 b. 特殊轉(zhuǎn)字面)
這里我們重點(diǎn)講一下 \n 和 \r可能小伙伴們都聽過(guò)換行和回車吧!那么他們本質(zhì)上的意思是不一樣的!但是現(xiàn)在很多編譯器讓換行( \n )里面也包含了回車( \r ) 的功能!那他們倆究竟有什么樣的區(qū)別呢?
換行:讓光標(biāo)移動(dòng)到下一行
回車:光標(biāo)回到當(dāng)前行的最開始
這里小伙伴可以試一下用C語(yǔ)言寫一個(gè)簡(jiǎn)單的倒計(jì)時(shí)功能,就能很明顯的區(qū)分換行和回車的區(qū)別了!

這里我們也可以來(lái)看一道筆試題:
//以下程序輸出什么?
#include <string.h>
#include <stdio.h>
int main()
{
printf("%d\n", strlen("abcdef"));
// \62被解析成一個(gè)轉(zhuǎn)義字符
printf("%d\n", strlen("c:\test\628\test.c"));
return 0;
}這里第一個(gè)打印函數(shù),我們?nèi)绻辛私?,strlen() 函數(shù)是求字符串中 \0 之前的字符個(gè)數(shù),所以第一個(gè)打印的是 6 , 第二個(gè)打印函數(shù),首先是 \t 被解析成一個(gè)轉(zhuǎn)義字符, \62 也被解析成一個(gè)轉(zhuǎn)義字符 (8進(jìn)制) 所以第二個(gè)打印的應(yīng)該是 14 !
3、單引號(hào)和雙引號(hào)
3.1 基本概念
對(duì)于C語(yǔ)言有了解的小伙伴都知道,單引號(hào)引起來(lái)的都是字符常量,雙引號(hào)引起來(lái)的都是字符串常量,但其實(shí)對(duì)于初學(xué)者來(lái)說(shuō)還是容易出錯(cuò),比如 'a',和 "a" 是完全不一樣的概念,在字符串中,以 \0 為結(jié)尾,他本質(zhì)上不屬于字符串的元素內(nèi)容,只能說(shuō)他是字符串結(jié)束標(biāo)識(shí)符,但是它會(huì)占用空間!也就是 'a' 會(huì)占一個(gè)字節(jié)而 "a",則會(huì)占兩個(gè)字節(jié)。
有了上面簡(jiǎn)單的概念我們來(lái)看一個(gè)例子:

這里可能就有小伙伴有疑問(wèn)了,前兩個(gè)和最后一個(gè) printf打印結(jié)果我還能理解,可是第三個(gè)為啥是占四個(gè)字節(jié)呢?這明明不是一個(gè)字符常量嗎?(C++ 中第三個(gè)大小為 1 個(gè)字節(jié),因?yàn)檫@里是講C語(yǔ)言所以我們不討論其他語(yǔ)言)
其實(shí)在 C99 標(biāo)準(zhǔn)的規(guī)定,'1' 叫做整型字符常量(integer character constant),被看成是 int 類型。
光是用 “ 標(biāo)準(zhǔn)規(guī)定 ” 用來(lái)證明是不可行的,我們?cè)儆靡粋€(gè)實(shí)例來(lái)證明:

看到這個(gè)結(jié)果不要驚訝,我剛剛說(shuō)過(guò),標(biāo)準(zhǔn)規(guī)定,整型字符常量被看成是 int 類型,所以他會(huì)有四個(gè)字節(jié)的空間,而且我當(dāng)前電腦是小端存儲(chǔ),所以低字節(jié)序放在低地址處,在者,將一個(gè)4字節(jié)的數(shù)據(jù)放入 char 類型的變量中是會(huì)發(fā)生數(shù)據(jù)截?cái)嗟?,?huì)將低地址的一個(gè)字節(jié)內(nèi)容放入 char 類型的變量中,所以其實(shí)最終 c 變量里放的只是一個(gè) 'd' 字符!
但是我不推薦上面這種寫法?。?!我們明白其中道理就好。
那這里有的小伙伴又開始下去實(shí)驗(yàn)了,于是寫出了這樣的代碼:

因?yàn)橐粋€(gè)整型字符常量只有 4 個(gè)字節(jié)空間,他如何能放得下 5個(gè)字節(jié)甚至更多呢?
3.2 特殊情況

顯而易見,是不能出現(xiàn)空整型字符常量的,但是可以出現(xiàn)空字符串,因?yàn)樽址Y(jié)束標(biāo)識(shí)符 \0 雖然不能算字符串元素內(nèi)容,但是它也是占大小的。
4、邏輯操作符
4.1 && (邏輯與)
概念:級(jí)聯(lián)兩個(gè)(多個(gè))邏輯表達(dá)式,必須同時(shí)為真,結(jié)果才為真。
例子:

對(duì)于邏輯與的短路現(xiàn)象,因?yàn)槲覀兙幾g器是從左往右掃描的,所以如果當(dāng)表達(dá)式左邊為假的話,它就不會(huì)去執(zhí)行邏輯與右邊的表達(dá)式,這也就是我們所稱的短路現(xiàn)象:

4.2 || (邏輯或)
概念:級(jí)聯(lián)兩個(gè)(多個(gè))邏輯表達(dá)式,必須至少一個(gè)為真,結(jié)果才為真。
例子:

上面這個(gè)例子同時(shí)也包含了邏輯或的短路現(xiàn)象,在邏輯或中,因?yàn)榫幾g器是從左往右掃描代碼的,所以只要表達(dá)式左邊為真,則不需要進(jìn)行右邊的判斷。
4.3 邏輯與和邏輯或的筆試題
因?yàn)閷?duì)于前置++和后置++我還沒(méi)有講,所以有基礎(chǔ)的同學(xué)可以先看看,沒(méi)基礎(chǔ)的可以等我下期出了符號(hào)第二期在回來(lái)看這道題。

第一個(gè)邏輯與表達(dá)式,a 變量的初始值是 0 ,而且是后置++,先使用表達(dá)式的值,在進(jìn)行自增,而邏輯與必須滿足表達(dá)式兩邊的值都為真,但凡有一個(gè)為假都不會(huì)執(zhí)行后面的表達(dá)式,所以只有 a 變量發(fā)生了變化。第二個(gè)邏輯或表達(dá)式,邏輯或只要表達(dá)式兩邊有一個(gè)為真即可,a++ 判斷為假,會(huì)接著判斷 ++b, 前置++ 是先自增在使用,所以 ++b 表達(dá)式為真,也就不會(huì)去執(zhí)行后面表達(dá)式了,也就是說(shuō),只有 a和b變量的值發(fā)生了變化。
到此這篇關(guān)于C語(yǔ)言各種符號(hào)的使用介紹上篇的文章就介紹到這了,更多相關(guān)C語(yǔ)言符號(hào)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言詳細(xì)解析有符號(hào)數(shù)與無(wú)符號(hào)數(shù)的表示
- C語(yǔ)言詳細(xì)講解注釋符號(hào)的使用
- C語(yǔ)言特殊符號(hào)的補(bǔ)充理解
- 關(guān)于C語(yǔ)言中弱符號(hào)與弱引用的實(shí)際應(yīng)用問(wèn)題
- C語(yǔ)言中無(wú)符號(hào)與有符號(hào)及相加問(wèn)題
- C語(yǔ)言中無(wú)符號(hào)數(shù)和有符號(hào)數(shù)之間的運(yùn)算
- 舉例講解C語(yǔ)言鏈接器的符號(hào)解析機(jī)制
- 詳解C語(yǔ)言中的符號(hào)常量、變量與算術(shù)表達(dá)式
- C語(yǔ)言各種符號(hào)的使用介紹下篇
相關(guān)文章
C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
解析為何要關(guān)閉數(shù)據(jù)庫(kù)連接,可不可以不關(guān)閉的問(wèn)題詳解
本篇文章是對(duì)為何要關(guān)閉數(shù)據(jù)庫(kù)連接,可不可以不關(guān)閉的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C++實(shí)現(xiàn)四則混合運(yùn)算計(jì)算器
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)四則混合運(yùn)算計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
C++實(shí)現(xiàn)圖書管理系統(tǒng)最新版
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書管理系統(tǒng)最新版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
strcat函數(shù)與strncat函數(shù)的深入分析
本篇文章是對(duì)strcat函數(shù)與strncat函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C語(yǔ)言實(shí)現(xiàn)基于最大堆和最小堆的堆排序算法示例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)基于最大堆和最小堆的堆排序算法示例,分別是基于最大堆的升序排序和基于最小堆的降序排序?qū)嵗?需要的朋友可以參考下2016-06-06
C語(yǔ)言實(shí)現(xiàn)歌曲信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)歌曲信息管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

