牛客網C 刷題十三

2021-10-03 10:03:46 字數 1585 閱讀 2521

為什麼標準標頭檔案都有類似以下的結構?

#ifndef __incvxworksh

#define __incvxworksh

#ifdef __cplusplus

extern

"c"#endif

#endif

/* __incvxworksh */

#ifndef __incvxworksh

#define __incvxworksh

#endif

的作用是防止函式被重複引用。

作為一種物件導向的語言,c++支援函式過載,而過程式語言c則不支援。函式被c++編譯後在symbol庫中的名字與c語言的不同。例如,假設某個函式的原型為:

void foo(int x, int y);

該函式被c編譯器編譯後在symbol庫中的名字為_foo,而c++編譯器則會產生像_foo_int_int之類的名字。_foo_int_int這樣的名字包含了函式名和函式引數數量及型別資訊,c++就是靠這種機制來實現函式過載的。

為了實現c和c++的混合程式設計,c++提供了c連線交換指定符號extern "c"來解決名字匹配問題,函式宣告前加上extern "c"後,則編譯器就會按照c語言的方式將該函式編譯為_foo,c++函式可以呼叫c的函式了。

#endif就近原則

對條件編譯(#ifdef,#else,#endif,#if等)進行說明。以下分3種情況:

1:情況1:

#ifdef _***x

…程式段1…

#else

…程式段2…

#endif

這表明如果識別符號_***x已被#define命令定義過則對程式段1進行編譯;否則對程式段2進行編譯。

例:#define num……

…#ifdef num

printf(「之前num有過定義啦!\n」);

#else

printf(「之前num沒有過定義!\n」);

#endif

}如果程式開頭有#define num這行,即num有定義,碰到下面#ifdef num的時候,當然執行第乙個printf。否則第二個printf將被執行。

我認為,用這種,可以很方便的開啟/關閉整個程式的某項特定功能。

2:情況2:

#ifndef _***x

…程式段1…

#else

…程式段2…

#endif

這裡使用了#ifndef,表示的是if not def。當然是和#ifdef相反的狀況(如果沒有定義了識別符號_***x,那麼執行程式段1,否則執行程式段2)。例子就不舉了。

3:情況3:

#if 常量

…程式段1…

#else

…程式段2…

#endif

這裡表示,如果常量為真(非0,隨便什麼數字,只要不是0),就執行程式段1,否則執行程式段2。

我認為,這種方法可以將測試**加進來。當需要開啟測試的時候,只要將常量變1就好了。而不要測試的時候,只要將常量變0。

牛客網C 刷題

今天刷了些c 的題,就其中物件導向分享一下我的感悟。首先區分一下物件導向和面向過程 物件導向是首先抽象出各種物件 各種類 把資料和方法都封裝在物件中 類 然後各個物件之間發生相互作用。面向過程是將問題分解成若干步驟 動作 每個步驟 動作 用乙個函式來實現,在使用的時候,將資料傳遞給這些函式。stl有...

牛客網刷題

時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 立華奏在學習初中數學的時候遇到了這樣一道大水題 設箱子內有 n 個球,其中給 m 個球打上標記,設一次摸球摸到每乙個球的概率均等,求一次摸球摸到打標記的球的概率 e...

牛客網刷題

時間限制 c c 2秒,其他語言4秒 空間限制 c c 524288k,其他語言1048576k 64bit io format lld 立華奏是乙個剛剛開始學習 oi 的萌新。最近,實力強大的 qingyu 當選了 iods 9102 的出題人。眾所周知,iods 是一場極其毒瘤的比賽。為了在這次...