C 語言有哪些冷知識?

時間 2021-05-11 17:39:20

1樓:此生不換

c語言常用到的幾個冷知識

一,巨集定義中的特殊引數(#、##、...和__VA_ARGS__)

1,「#」這個特殊的巨集定義引數也特別有用.#作為乙個預處理運算子,它可以把語言符號字串化(stringizing).例如我們定義的變數等.

簡單的說就是把定義值變成字串,常用於列印;

#define StringInt(x) #x

int test()

printf("test int is %s\n",StringInt(2));

執行結果:test int is 2

2,##運算子可以用於類函式巨集的替換部分.##還可以用於類物件巨集的替換部分.這個運算子可以把兩個語言符號組合成單個語言符號

#define MYNAME(n) "I am##n"

int test()

printf("test string: %s\n",MYNAME(gchen));

執行結果:test string:I an gchen

定義自動產生陣列

#define BEGIN_MAP(name) \

static const int name## _entrys = \

,#define END_MAP(name) \

\}; \

3 __VA_ARGS__引數部分應該為要替換為的部分的變數,只能代替後面的引數.

#define CHECK1(x, ...) if (!(x))

#define CHECK2(x, ...) if ((x))

#define CHECK3(...)

#define MACRO(s, ...) printf(s, __VA_ARGS__)

int main()

錯誤的用法:

#define W(x,...,y)

2樓:JavaPub

資料格式詳解

2^8=256( 同樣是乙個位元組,無符號數的最大值是255,而有符號數的最大值是127。)

2^10=1024

2^16=65536(32768,3萬)

2^32=4294967296 (大約40億,4後面10個0)float最少可表示6位小數

double最少可表示15位小數

long double最少可表示18位小數C語言變數名與函式名最長不能超過63位元組,extern不能超過31位元組,每行至多支援到節

3樓:咕嘰咕嚕

類C語言裡陣列的下標表示法與x86組合語言的直接定址方式(帶比例因子)所表示的陣列元素非常類似。

舉個例子,以下兩個語言的語句是等價的。

C語言:array[3] =6;//假設此台機器上int類占用4個位元組

x86組合語言:

. data

array DWORD 1,2,3,?

index BYTE 3

. code

main PROC

MOV DWORD PTR array[index*(TYPE array)],6

main ENDP

4樓:Zzcode

說個有意思的

*(a+i) == *(i + a)a[i] ==i[a]

據說C語言的指標操作是從B語言繼承來的,B語言只有一種型別WORD,所以上面的表示式很自然,但C語言有多種型別,所以有這個看似語義不通的語法糖。

說他語義不通是因為指標型別和int型是兩種不同的型別,但在上面的式子裡,他們是可以互換的,這在語義上說明他們是同型別,前後矛盾了。

再說乙個。眾所周知scanf函式很好用,但他不安全,因為他的緩衝區缺少檢查。舉個例子

int a; char str[5];

scanf("%d", &a); scanf("%s", str);

如果輸入1回車abcde回車,則很可能a會被置為0。

因為scanf的緩衝區讀取了回車符號,於是字串最末尾的'\0'會將a覆蓋(涉及到scanf緩衝區的佇列實現和堆疊位址分配方式,具體不同編譯器可能有所不同,有興趣的同學可以自己嘗試下),這樣就造成了緩衝區溢位的錯誤。

大一寫作業碰到的問題,困擾了我好久,也開啟了我新世界的大門。

5樓:痞子湯

1. C語言中 arr[index] 可以寫成 index[arr] 形式

編譯後將輸出結果為 1

2. 可以通過使用 <: 和 :> 來代替 [ 和 ] 使用 『<% 和 %>』 來代替 『』

編譯後將輸出結果為 1

6樓:

c標準vs的支援也非常糟糕,甚至連巨集的處理方式都很奇葩。

#define a(...) b(__VA_ARGS__, 2,1,0)

#define b(_0,_1,_n,...) _n

a(x,y)呼叫,按理說應該轉為b(x,y,2,1,0),之後轉為2,但是vs這個奇葩不是這樣的。。這裡的b(x,y,2,1,0)會被轉為1,把x,y看成乙個元素了。

另外在Windows系統下,c標準庫,很多函式微軟不推薦使用,比如stdio裡面對檔案,目錄的一大堆函式。另外還有很多stdc的函式在Windows下不是執行緒安全的。

WinAPI是u16編碼的,比如writeConsole,createFile,如果要考慮到適應各種語言的Win版本,就要考慮這些。

txt模式讀寫檔案,檔案長度和讀到的位元組數未必一樣,比如檔案裡面\r\n,讀出來就僅僅是\n了。另外還有utf8 bom,在檔案頭多了一點東西。

再說個c++的。

class A{};

class B{};

class XA: A;

class XAB: A,B;

在vs下,這個A,B的size不是0,XA的size是4(int),XAB的size是8。也就是說,繼承1個空class,沒有增加class大小,但是繼承2個就不行了。

7樓:陳小楞

C89是允許隱式宣告的,如果乙個函式被隱式宣告和呼叫,返回值會預設改為int型別

#include

intmain

()float

foo(

floatx,

floaty)

不過這個特性已經被C99移除了

Major changes in the second edition included:

...— remove implicit function declaration

Dereferencing NULL來計算資料結構成員的偏移量&(((type *)0)->field)

8樓:山楂山楂片

說兩個c++和c語言不同的地方吧。

1. 在c語言中,字元常量是int型別;在c++中,字元常量是char型別。

2. 在c語言中,三目運算子(?:)的結果一定是右值,而在c++中,如果:旁邊的兩個運算元是左值,那麼結果也是左值。

9樓:鄭小信

我來說乙個不算冷知識的吧……

在Primer裡面看到的,結構體裡面的冒號。

用冒號限定該 field 所佔的位數。

structA;

趨近於運算子以及陣列下標那個大家應該都知道了。陣列下標顛倒那個很多編譯器都能編譯,但是一些IDE不一定支援。

restrict (現在)算是C語言特有的關鍵字了……這一點在 CLion 中可以體現。在CMakeLists.txt 裡面把標準分別設定C++和C的時候關鍵字的高亮也會變化。

(如果是在VS裡面,那麼 .cpp 照樣會高亮 restrict 關鍵字。

10樓:

區域性變數必需在塊(左大括號)開始的地方宣告, 然後再寫語句。

如果乙個函式在宣告時,沒寫引數,那麼呼叫它時可以傳任意數量的引數給它(我不確定有沒有記錯)

11樓:左江

有不少未定義行為挺冷的比如

volatile int n = 10;

n+n //這樣的表示式就已經是未定義行為了

fseek有一點非常冷, 對於文字模式開啟的FILE*, 引數不能隨便寫的. 比如, 假設fp是乙個文字模式開啟的FILE*

fseek(fp, 0, SEEK_END);//這樣的用法是錯的, 不能確保會定位到檔案尾部

能確保執行結果符合預期的引數只有2種

fseek(fp,0,SEEK_SET);

fseek(fp,ftell(fp),SEEK_SET);

說到檔案操作, 讀操作和寫操作不能直接交替使用. 需要在中間插入乙個fseek或者其他設定讀寫位置的函式

檔案開啟模式裡面"ab+"可以寫成"a+b", 但是"b+a"是不行的. 哈哈

追加模式開啟檔案 "a+" "ab+" "a" "ab", 這個模式很特別. 寫入資料會固定在檔案最後fseek無法影響寫操作, 但是fseek對讀資料操作有效, 瑟瑟發抖吧

字串的轉義字元中有一點很冷並且有可能坑人 .八進位制轉義最多三位 "\0123"是按照'\012' 和'3'理解的,這一點基本都有所了解.但是接下來要說的就是深坑了,不僅反直覺而且大多數入門書還講錯,十六進製制轉義是沒限制最大位數的 "\" 字串只有2個位元組的資料乙個是前面的'\xFF' 另乙個字串結尾的'\0'.

唱征服吧,我第一次發現這一點的時候,一直懷疑是有毛病的設計.現在還是懷疑這是有毛病的設計

陣列有一點比較特別指標指向陣列最後乙個元素後面乙個元素是保證正確的但再多久不行

標準文件保證 int arr[10]; arr+10-1 一定是等於 arr+9 但是對於 arr+11-2 就不保證正確了

12樓:土地測量員

額,說個可能沒這麼冷的。

C語言中的整型常量(就是直接出現在表示式裡的字面量,比如說0x6、6)也是有型別的,字面量能加字首的0x或者0表示進製,也能加字尾的u、ll等。 不同的字首和字尾組合的字面量都有個型別的候選列表,整型常量的型別是值可以匹配的第一種型別。詳細的描述見下面這個鏈結。

integer constant

整型常量並不能表示負數。常見的諸如-1之類的表示式是將一元負運算子-應用於常量表示的1。

所以這就帶來了乙個有意思的地方。在int型別用32位補碼表示的機器上,INT_MAX和INT_MIN一般得這麼定義的:

#define INT_MAX 2147483647

#define INT_MIN (-INT_MAX – 1) // 什麼鬼?

大家應該都了解補碼,32位的資料能表示的最大的整數的位級表示是0x7FFFFFFF,即2147483647;最小的整數的位級表示是0x80000000,即-2147483648。但我們並不能直接#define INT_MIN -2147483648或者#define INT_MIN 0x80000000 。原因就在於上面提到的整型常量的型別。

如果#define INT_MIN -2147483648,由於沒有負整數常量,那麼首先來判斷2147483648的型別。它屬於無字尾的十進位制,從C99開始,候選列表為:

intlong int

long long int

而在int是32位補碼表示的機器上,int最大為 2147483647, 2147483648會被當成long int型別或者long long int型別。總之不會是int。

#define INT_MIN 0x80000000就更離譜了,因為這個表示的甚至都不是負數(整型常量並不能表示負數。)。

防彈有哪些冷知識?

我把我個人的看法寫寫吧 我是團飯 但心中最愛的是JIMIN 看著他一路走來不容易他們七個都不容易 看了前面幾個回答有提到南俊說智旻私底下其實非常成熟穩重是的我早就有想到 其實仔細想想從我的角度去看智旻感覺很像我我也是天秤座的人所以有些時候真的懂得那些沒必要的猜想和疑慮 不論是直播還是公開場合的笑容不...

在各國語言中有哪些冷知識?

清風 資料內容 傳訊師 吉姆先生 N實體提問 我一直想知道,Hatonn群體和你們Latwii群體,以及一些其他群體,使用的結尾語 Adonai vasu borragus 是什麼語言?怎麼解釋它?Latwii群體 我們是 Latwii,覺察你的詢問,我的弟兄。你問到的這些話語,在你們星球上,有些人...

皇室戰爭有哪些冷知識?

DuaiHan1020 只知道不算冷的知識 1,天狗爆出幼犬瞬間,幼犬聚集在一起,可以被某些範圍攻擊瞬秒。比如炮手,不過這種情況非常罕見 2,蝙蝠可以配合皇家塔完美解火法 小骷髏不知道行不行?3,放野豬前面墊乙個單位,比如武神,騎士,把野豬擠到外側,可以防風吸主塔 4,在電龍 忙 的時候,地獄龍可以...