日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

这不是bug,而是语言特性

發(fā)布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 这不是bug,而是语言特性 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

分析編程語言缺陷的一種方法是把所有的缺陷歸于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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。