牛客網C 客觀題趣題趣談

2022-09-20 19:03:08 字數 3051 閱讀 9331

最近在做牛客網上的c/c++的選擇題,鞏固一下語法知識,把錯的題總結一下。

當然不是所有都有總結,有明顯歧義的不管,過於簡單的不管(簡不簡單因人而異,我先閱讀了c++ primer後再開始做的練習,因此對於原書中重點強調過的知識會記憶更深刻,書中沒怎麼提到的知識就相對容易出錯)。

筆者的水平相當有限,錯誤會很多,懇請不吝時間指出。

(仍在更新中)

1. switch的本質

#include "stdio.h"

int main()

}printf("%d\n", c);

return 0;

}

以下程式的輸出結果是3。

解析:switch的規則是

如果沒有匹配到case又沒有default則不執行。實際編碼中不應像上文這麼寫,如果有default應該寫最後。

2. 只能內過載的運算子

下列關於賦值運算子「=」過載的敘述中,正確的是

a. 賦值運算子只能作為類的成員函式過載

b. 預設的賦值運算子實現了「深層複製」功能

c. 過載的賦值運算子函式有兩個本類物件作為形參

d. 如果己經定義了複製拷貝建構函式,就不能過載賦值運算子

答案為a。解析::: * . ?:是特殊的不能過載的運算子,而更特殊一類運算子的是= () ->,他們可以過載,但是必須過載在函式內部,不允許過載為外部友元函式,即class& operator=(class &x, class &y)這樣的形式是不被允許的。

原因見此:csdn 關於有些運算子只能用成員函式過載

3. 常量字串的賦值

const char *p1 ="hello";

char *const p2 = "world";

給出以下定義,下列哪些操作是合法的?

a.p1++;

b.p1[2] = 'w';

c.p2[2] = 'l';

d.p2++;

選a。解析:首先我們要理解頂層和底層const,const*代表指標指向的值不能修改,*const代表指標自身不能被修改,因此b和d錯誤。而乙個字面量字串其實是乙個常量字元陣列,被單獨存放在唯讀區,他雖然可以賦值給沒有頂層const的指標,但是卻仍然不可修改,因此c錯誤。在實際測試中,c選項會給出警告,並在執行時發生錯誤。

4. 傳指標卻不修改值

#include #include void fun(int *p1, int *p2, int *s) 

int main() , b[2] = , *s = a;

fun(a, b, s);

printf("%d \n", *s);

}

答案為1,不是11。雖然s作為傳入了函式,但s自己不是引用,仍是按值傳遞,因此改變的s,與main裡的s沒有關係。

主要是陰,實際應用中是不會出現這種情況的。

5. dynamic_cast的用法

struct a1

};struct a2

};struct b1 : a1, a2{};

int main()

a. l1語句編譯失敗,l2語句編譯通過

b. l1語句編譯通過,l2語句編譯失敗

c. l1,l2都編譯失敗

d. l1,l2都編譯通過

選b。static_cast用於普通的型別轉換,但是pb1是a1的指標,a1和a2之間沒有繼承關係,所以轉換不被允許。而dymamic_cast是執行時轉換,一定可以通過編譯;在實際執行時,程式檢測pb1的實際型別(這裡是b1)能否通過繼承關係轉化為a2*(在這裡可以),若存在關係則轉換,否則返回空指標。

當然我們知道所有指標大小是一樣的,如果非要在編譯期轉換,可以使用c風格強制轉換a2* pb22 = (a2*)pb1

6. 區域性變數的引用

std::string& test_str()

int main()

區域性變數返回後即銷毀,這樣的寫法是不對的,但是實際上可以通過編譯,只會給出警告,並在執行期發生錯誤。c++秉承「相信程式設計師」的原則不做檢查,我們只能自己小心。

7. 友元宣告問題

#include #include using namespace std;

class point

public:

point(int x, int y) : x_(x), y_(y) /* ② */

private:

int x_;

int y_;

};int main(void)

請問程式會在哪個地方發生編譯錯誤?答案是不會。雖然distance定義在類中,但他不是成員函式,是乙個外部函式。

但是這道題有不合理的地方,友元宣告和宣告是不一樣的,首先來說一說規範寫法:

「友元宣告」只是表明友元關係,與外部的宣告是分離的。因此,一般來講,即使向上面一樣將定義放在友元宣告後,也需要在類外再宣告一次。

但是上面的**沒有這樣做,這是因為另乙個例外:如果這個函式的引數帶有這個類,則可以不用宣告。上例中distance帶有的point引數,如果把他改成空引數,就不再能通過編譯了。

實際程式設計中應該避免這種「例外」的發生。友元本就不屬於類,應該寫在外面;況且「不用宣告」這個特性並非標準,某些編譯器並不支援。

牛客網C 刷題

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

牛客網程式設計題

參考了排行榜大神 1.計算字串最後乙個單詞的長度,單詞以空格隔開 a raw input b a.split print len b 1 2.寫出乙個程式,接受乙個有字母和數字以及空格組成的字串,和乙個字元,然後輸出輸入字串中含有該字元的個數。不區分大小寫 a raw input lower b r...

牛客網 簡單題

給出乙個數學式子和兩個關係,知道其他所有數的值,求最後乙個的值 這道題目關鍵點有兩個 1.1.1.一開始的式子其實自然對數e ee的求值公式 2.2.2.對於題目要求的任意保留小數,我們可以用到c c c 中的ios iosios cout include include include inclu...