C語言筆試題容易忽略的一些細節
今天的筆試雖然很簡單,但是有些地方考察的很細。平常不注意看很容易忽略。所以基礎很重要。
問題一:關於#include <*.h> 與#include "*.h"的說法錯誤的是:()
(A)#include <*.h>只搜尋系統路徑
(B)#include "*.h"只搜尋使用者檔案
(C)#include "*.h"先搜尋使用者檔案,再去系統路徑搜尋
(D)兩者可能等價
註解:題目本意大概是這樣。(B)
帶"" 意思是表示先在當前程式所在的目錄尋找所包含的檔案,,如果沒有就尋找系統檔案。
帶<>是只直接調用系統檔案,而不去尋找目錄所包含的檔案。
所以一般調用系統標頭檔都是用<>這樣速度更快,使用者的標頭檔就用""。
問題二:記憶體對齊
struct
{
short s;
char c;
float f;
}cs;
sizeof(cs),這道題出題人給的選項居然沒有正確答案。應該是8,(2+1)+1+4=8。當時想著都要向4位元組靠齊,4+4+4=12。
問題三:引用與指標的區別
從根本理解,引用是變數的別名;指標是指向變數的地址。詳細的話可以從下面三點考慮:
引用的規則:
(1)引用被建立的同時必須被初始化(指標則可以在任何時候被初始化)。
(2)不能有NULL引用,引用必須與合法的儲存單元關聯(指標則可以是NULL)。
(3)一旦引用被初始化,就不能改變引用的關係(指標則可以隨時改變所指的對象)。
問題四:運算子優先順序
a&b>>2:分不清&還是>>優先順序高。優先順序記憶方法:
去掉一個最高的,去掉一個最低的;
剩下的是一、二、三、賦值;
雙目運算子中,順序為算術、關係和邏輯,移位和邏輯位插入其中。
問題五:隱式類型轉換
已知:int a=2,b=4,c=3;下面與a+b+c(=9)值不相等的項為:BC
(A)(a+b)*c/2 (=9) (B)1/2*(a+b)*c (=0) (C)c/2*(a+b) (=6)
問題六:前自增後自增與左值、右值
在C++中,為什麼前自增操作產生左值,後自增操作產生右值?為什麼有這樣的區別?
前自增返回的就是自增後的“自己”(引用),而後自增返回的是自增前“自己的副本(臨時變數)”。
前自增操作先對對象本身操作,然後返回對象本身,一般返回引用,可以被賦值;
後自增操作一般用一個臨時變數儲存對象,然後對對象操作,返回臨時變數,這個臨時變數一般來說是右值,不能修改。
以後慢慢匯總。。。。。。