【C++方向】 面試問題彙總


前言

包含本人面試遇到的問題和麪經裏面的問題。好記憶不如爛筆頭【淦】
 
 
 

C++


問題描述】談一談static關鍵字
】static關鍵字可以修飾局部變量、全局變量、函數、類中的成員變量和函數

  • 修飾全局變量
       一般情況下局部變量都是在棧區被定義,並且在語句塊結束的時候,局部變量會被系統自動回收。如果使用static修飾局部變量,該變量就存放在靜態數據區,其生命週期可以持續到程序執行結束。但是,局部變量的作用域不會發生變化,仍然在定義該局部變量的語句塊中。
  • 修飾全局變量
       對於一個全局變量,它既可以在本源文件中被訪問,也可以在同一個工程的其他源文件中被訪問(只需要用extern聲明)。但是,用static修飾過的全局變量只用在本源文件中使用,即作用域從整個工程下降到定義該全局變量的源文件中。
      比如下面兩個源文件屬於一個工程。如果加static,則連接的時候會出錯
// A.cpp
#include "pch.h"

//int a = 10;
static int a = 10;
//B.cpp
#include "pch.h"
#include <iostream>
using namespace std;

extern int a;

int main()
{
	cout << a << endl;
}
  • 修飾函數
      和修飾全局變量一致
  • 在類中使用static
      在類定義中對某個函數或者變量使用static,則表示該函數或者變量屬於這個類而不是類的某個實例化對象。使用static修飾之後,函數或者變量在存儲空間中都只存在一個副本。可以通過類名和對象調用。
     

問題描述】談一談const關鍵字

 

操作系統


問題描述】說明庫函數和系統調用的區別和聯繫。
】庫函數是語言或應用程序的一部分,運行在用戶空間中。而系統調用時操作系統的一部分,是內核提供給用戶的程序接口,運行在內核空間中,而且許多庫函數都會使用系統調用來實現功能。沒有使用系統調用的庫函數,執行效率通常比系統調用高。因爲使用系統調用時,需要上下文的切換以及狀態的轉移(由用戶態轉向核心態)。
 

問題描述】談一談中斷機制
】(自己理解的)中斷是指某些事件使得處理器暫停當前正在處理的進程,保存現場後,轉而去執行其他程序。引起中斷的事件可以分爲中斷(外中斷)異常(內中斷)系統調用。當中斷髮生時,運行用戶態的CPU會立即進入核心態,這是通過硬件實現的

  • 中斷(外中斷):指來自CPU執行指令以外的事件的發生,如設備發出I/O結束中斷,時鐘中斷等。這些中斷起到通知CPU的作用。
  • 異常(內中斷):指源自CPU執行指令內部的事件,如算術溢出,地址越界,虛存缺頁等。異常不可以被屏蔽,一旦出現應當立即處理。
  • 系統調用:指用戶在程序中調用操作系統所提供的一些子功能,CPU只能在核心態下執行這些子功能。系統調用不是中斷,但是它會引起中斷(用戶程序使用訪管指令,系統根據訪管指令的操作數執行對應的中斷處理程序。)。
     

問題描述】進程與線程的異同
進程是程序在某個數據集上的一次動態執行。在多道程序設計中,爲了更好的描述和控制程序的運行,解決程序的異步性,增加系統的併發程度,於是引入了進程的概念。線程可以理解爲“輕量級進程”,它基本上不包含系統資源。線程的引入加快了系統的並行速度,因爲線程的上下文切換更快速。未引入線程之前,進程是資源分配和處理器調度的基本單位,引入線程之後,進程只是用來分配資源,線程變成了處理器調度單位。 這樣一來,系統的上下文切換速度變快了,而且線程之間的通信變得更加簡單。
 

問題描述】談談進程間的通信方式
】有三種方式:共享存儲,消息傳遞,管道通信

  • 共享存儲:在通信的進程之間設置一塊可直接訪問的共享空間,通過對這片空間的讀寫操作進行進程間的通信。注意:這種方法需要同步互斥工具。
  • 消息傳遞:進程間的通信以格式化的消息爲單位。進程通過系統提供的發送消息原語和接收消息原語進行數據交換。
  • 管道通信:“管道”是用來連接一個讀進程和一個寫進程的共享文件,這個共享文件是一個具有固定大小的緩衝區,它不屬於文件系統,只存在於內存上。緩衝區只允許一邊進行寫入,一邊進行讀出。管道可以實現雙向的數據傳輸,但是同一時刻只能有一個方向,所以管道的通信必然是半雙工通信
     

問題描述】什麼是管程?管程由那幾部分組成?爲什麼要引入管程
】一個管程定義了一個數據結構和能被併發進程所執行的、在該數據結構上的一組操作,這組操作能同步進程和改變管程中的數據。管程包括:局部於管程的共享變量說明;對該數據結構進行操作的一組進程;對局部於管程的數據設置初始值的語句。管程的引入是爲了解決臨界區分散所帶來的管理和控制問題。管程一次只允許一個進程進入管程內,從而既便於系統管理共享資源,又能保證互斥。
 

計算機網絡


 
 

智力題


老鼠嗑藥

問題描述】你現在有1000瓶藥,其中有一瓶有毒,你還有10只老鼠。老鼠在嗑了毒藥之後,1個小時會死亡。請問如何使用1個小時判斷出哪一瓶藥有毒?
】使用二進制方法。對藥進行編號1 ~ 1000,在對老鼠進行編號1 ~ 10。比如第123瓶藥的10位二進制表示爲0001111011,那麼就讓編號爲(1,2,4,5,6,7)號的老鼠嗑這一瓶藥。1個小時之後看那些老鼠死了,死了的老鼠對應的二進制爲1,活着的老鼠對應的二進制爲0。
 

博弈拿石子

問題描述】43個石頭,A,B輪流拿,每次可以拿1~3個,A先拿能否保證自己獲勝(獲勝的條件是做“收尾工作”)?
】當只有1~3個時,A先拿就會贏。當有4個時,A先拿就會輸。所以最後只需要剩下4個,然後讓B先拿即可。一般規律是,如果有n的石子,A先拿x個,並且保證剩下的石子數量(n-x)是4的倍數,此時A一定可以獲勝。對於這道題,A可以先拿3個,此時還剩40個,所以A可以贏。
 

亮着的燈

問題描述】1000盞燈開着,1000個人標號1~1000依次進入,每個人進去按一下自己標號倍數的開關,問最後哪些燈亮着?
】對於一個燈如果被按偶數次開關,則這個燈依然亮着,按奇數次開關,則這個燈滅。一個燈的開關會被什麼編號的人按呢?如果一個人的編號是燈編號的因數,則這個人會按該燈的開關。一個數的因數是成對出現的,但是有一種數除外——可以開平方的數,這種數的因數一定有奇數個,比如16的因數有(1,16,2,8,4)。所以燈滅的就是1,4,9,16…這些,其他的都亮着~。

參考鏈接

  • https://github.com/chankeh/cpp-backend-reference/blob/master/back-end.md
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章