这不是bug,而是语言特性
分析編程語(yǔ)言缺陷的一種方法是把所有的缺陷歸于3類:不該做的做了,該做的沒(méi)做,該做但做得不合適。
在使用switch case時(shí),如果使用缺省的 fall through,請(qǐng)一定在旁邊注釋,因?yàn)?7%的情況需要使用break,break跳出的是最近的那層循環(huán)或者switch語(yǔ)句。
下面代碼,第一次調(diào)用和之后調(diào)用會(huì)出現(xiàn)不同:
1 #include<stdio.h> 2 3 void generate_initializer(const char * string) 4 { 5 static char separator=' '; 6 printf("%c %s\n",separator,string); 7 separator=','; 8 } 9 int main(void) 10 { 11 char *p="hi,guy,would you want strengh!"; 12 generate_initializer(p); 13 generate_initializer(p); 14 generate_initializer(p); 15 return 0; 16 }所以,static使用要走點(diǎn)心。
?太多的缺省可見(jiàn):
定義c函數(shù)時(shí),不管你加不加extern修飾,函數(shù)名都是全局可見(jiàn)的,這是缺省狀態(tài),除非你用static修飾。
一個(gè)文件要么全局可見(jiàn),要么對(duì)其他文件不可見(jiàn)。在C語(yǔ)言中,對(duì)信息可見(jiàn)性的選擇就是這么有限。如果別人問(wèn)你C語(yǔ)言什么讓你覺(jué)得難,你可以回答不支持很多特性,千萬(wàn)別回答指針就好^_^。
C語(yǔ)言中的重要符號(hào)重載:
static:用在函數(shù)內(nèi)部,表示變量的值在各個(gè)調(diào)用間一直保持延續(xù)性,這句話有點(diǎn)拗口,用通俗一點(diǎn)的話語(yǔ)就是,static修飾的局部變量,只初始化一次,而且它的值會(huì)一直保存。
用來(lái)修飾一個(gè)函數(shù)時(shí),表示該函數(shù)只對(duì)本文件可見(jiàn)。
extern:用于修飾變量時(shí),表示變量在其他地方(外部文件)定義了
用于函數(shù)的時(shí)候表示全局可見(jiàn),屬于冗余的,因?yàn)楹瘮?shù)缺省狀態(tài)就是全局可見(jiàn)的。
?當(dāng)sizeof的操作數(shù)是類型名時(shí),兩邊必須加上括號(hào)(這通常讓人誤以為它是一個(gè)函數(shù)),但操作數(shù)如果是變量則不必加括號(hào)。sizeof是運(yùn)算符。
優(yōu)先級(jí)可以查看c和指針81頁(yè)和c2p 最后一頁(yè)。
現(xiàn)在有如下表達(dá)式:
apple=sizeof(int)*p;你覺(jué)得這個(gè)表達(dá)式應(yīng)該如何解讀?
A:這里又很多種可能的解釋,但是為了不誤導(dǎo)或者留下誤導(dǎo)的索引,直接分析了。
sizeof ,強(qiáng)制轉(zhuǎn)化的括號(hào)()和解引用*的優(yōu)先級(jí)相同,所以,要是解釋為:解引用指針p強(qiáng)制轉(zhuǎn)換成int再sizeof肯定是不對(duì)的,為什么呢?它們?nèi)齻€(gè)的結(jié)合性都是從右向左的,所以sizeof(int)已經(jīng)結(jié)合,要是*p再結(jié)合,編譯器必然要報(bào)操作符錯(cuò)誤,我們可以再加上一個(gè)乘號(hào)*,這樣就明了了。
1 #include<stdio.h> 2 3 int main(void) 4 { 5 char tmp='a'; 6 char *p=&tmp; 7 int res; 8 res=sizeof(int)**p; 9 printf("%d\n",res); 10 return 0; 11 }要是不加一個(gè)操作符乘號(hào)*上去,會(huì)報(bào)錯(cuò):
從這里我們可以知道,上面的寫法是sizeof(int),其中括號(hào)不表示強(qiáng)制轉(zhuǎn)化,表示聚組功能,優(yōu)先級(jí)比sizeof還高。
三個(gè)尤其注意的優(yōu)先級(jí)問(wèn)題:
1.==和!=的優(yōu)先級(jí)高于&或|
2.算術(shù)運(yùn)算高于一維運(yùn)算:msb<<4+lsb 等價(jià)于msb<<(4+lsb)
3.逗號(hào)運(yùn)算符優(yōu)先級(jí)最低,比賦值都低:i=1,2 等價(jià)于(i=1),2
?空格——最后的領(lǐng)域:
“\”反斜杠,用在宏上時(shí),后面不要接空格,應(yīng)該直接換行,
#include<stdio.h>#define my 111\0#define you 111\0int main(void){printf("%d\n%d\n",my,you+1);return 0;}預(yù)編譯之后,111和0之間還是有空格的,所以反斜杠讓我們書(shū)寫宏的時(shí)候可以在多行操作,但是不能用于連接字符,因?yàn)闀?huì)多出空格,同樣,在多出空格不會(huì)影響代碼的時(shí)候,反斜杠“\”后面也不應(yīng)該加空格,應(yīng)該直接換行。
#include<stdio.h>int main(void){char a[]="abc\d";printf("%u\n",sizeof(a));char b[]="abcd";printf("%u\n",sizeof(b));return 0;}多出一個(gè)空格,這個(gè)是轉(zhuǎn)義回車造成的。
同樣,在z=y+++++x;這樣的表達(dá)式中,我們需要空格,不然編譯器無(wú)法解析上面的代碼,應(yīng)該手動(dòng)空格分離為:
z=y++ ?+ ? ++x;這樣編譯器才知道上面意思。在這樣的表達(dá)式中,ANSI C規(guī)定了一種逐漸為人熟知的”maximal munch strategy”(最大一口策略)。這種策略表示如果下一個(gè)標(biāo)記有超過(guò)一種的解決方案,編譯器將選取能組成最長(zhǎng)字符序列的方案,例如:z=y+++x;會(huì)被編譯器分解成z=y++ ?+ x;因?yàn)榈谝粋€(gè)+之后,后面還有一個(gè)+,可以組成最長(zhǎng)字符++.但是上面那個(gè)z=y+++++x;不手動(dòng)加空格就不能被編譯器正常分解,編譯器正常分解成z=y++ ?++ ? +x;這樣會(huì)報(bào)錯(cuò)。
?
轉(zhuǎn)載于:https://www.cnblogs.com/yangguang-it/p/6852545.html
總結(jié)
以上是生活随笔為你收集整理的这不是bug,而是语言特性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第九章 国际化、帮助系统和Qt插件
- 下一篇: luogu P1361 小猫爬山 [id