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