


C/C++培訓
達內IT學院
400-111-8989

本文是作者收集了一些關于C語言關鍵字面試題,此題可以為正在找工作的同事們提供很好的幫助。所以今天就寫篇推送給大伙好好講講這寫關于關鍵字的面試題,也讓我們的學習盡可能和實際崗位需求接軌,話不多說了,請看題:
問題(一):static關鍵字的作用?
答:Static的用途主要有兩個,一是用于修飾存儲類型使之成為靜態存儲類型,二是用于修飾鏈接屬性使之成為內部鏈接屬性。
1、靜態存儲類型:
在函數內定義的靜態局部變量,該變量存在內存的靜態區,所以即使該函數運行結束,靜態變量的值不會被銷毀,函數下次運行時能仍用到這個值。在函數外定義的靜態變量——靜態全局變量,該變量的作用域只能在定義該變量的文件中,不能被其他文件通過extern引用。
2、內部鏈接屬性
靜態函數只能在聲明它的源文件中使用。
問題(二):const關鍵字的作用?
答:
1、聲明常變量,使得指定的變量不能被修改。
const int a = 5;/*a的值一直為5,不能被改變*/
const int b; b = 10;/*b的值被賦值為10后,不能被改變*/
const int *ptr; /*ptr為指向整型常量的指針,ptr的值可以修改,但不能修改其所指向的值*/
int *const ptr;/*ptr為指向整型的常量指針,ptr的值不能修改,但可以修改其所指向的值*/
const int *const ptr;/*ptr為指向整型常量的常量指針,ptr及其指向的值都不能修改*/
2、修飾函數形參,使得形參在函數內不能被修改,表示輸入參數。
如int fun(const int a);或int fun(const char *str);
3、修飾函數返回值,使得函數的返回值不能被修改。
const char *getstr(void);使用:const *str= getstr();
const int getint(void); 使用:const int a =getint();
問題(三):volatile關鍵字的作用?
答:volatile指定的關鍵字可能被系統、硬件、進程/線程改變,強制編譯器每次從內存中取得該變量的值,而不是從被優化后的寄存器中讀取。例子:硬件時鐘;多線程中被多個任務共享的變量等。
問題(四):extern關鍵字的作用?
答:
1、用于修飾變量或函數,表明該變量或函數都是在別的文件中定義的,提示編譯器在其他文件中尋找定義。
extern int a;
extern int *p;
extern int array[];
extern void fun(void);
其中,在函數的聲明帶有關鍵字extern,僅僅是暗示這個函數可能在別的源文件中定義,沒有其他作用。如:
頭文件A:A_MODULE.h中包含
extern int func(int a, int b);
源文件A: A_MODULE.c中
#include “A_MODULE.h”
int func(int a, int b)
{
returna+b;
}
此時,展開頭文件A_MODULE.h后,為
extern int func(int a, int b);/*雖然暗示可能在別的源文件中定義,但又在本文件中定義,所以extern并沒有起到什么作用,但也不會產生錯誤*/
int func(int a, int b)
{
returna+b;
}
而源文件B:B_MODULE.c中,
#include “A_MODULE.h”
int ret = func(10,5);/
展開頭文件A_MODULE.h后,為
extern int func(int a, int b);/*暗示在別的源文件中定義,所以在下面使用func(5,10)時,在鏈接的時候到別的目標文件中尋找定義*/
int ret = func(10,5);
2、用于extern “c
extern “c”的作用就是為了能夠正確實現C++代碼調用其他C語言代碼。加上extern "C"后,會指示編譯器這部分代碼按C語言的編譯方式進行編譯,而不是C++的。
C++作為一種與C兼容的語言,保留了一部分面向過程語言的特點,如可以定義不屬于任何類的全局變量和函數,但C++畢竟是一種面向對象的語言,為了支持函數的重載,對函數的編譯方式與C的不同。例如,在C++中,對函數void fun(int,int)編譯后的名稱可能是_fun_int_int,而C中沒有重載機制,一般直接利用函數名來指定編譯后函數的名稱,如上面的函數編譯后的名稱可能是_fun。
這樣問題就來了,如果在C++中調用的函數如上例中的fun(1,2)是用C語言在源文件a_module.c中實現和編譯的,那么函數fun在目標文件a_module.obj中的函數名為_fun,而C++在源文件b_module.cpp通過調用其對外提供的頭文件a_module.h引用后,調用fun,則直接以C++的編譯方式來編譯,使得fun編譯后在目標文件b_module.obj的名稱為_fun_int_int,這樣在鏈接的時候,因為_fun_int_int的函數在目標文件a_module.obj中不存在,導致了鏈接錯誤。
解決方法是讓b_module.cpp知道函數fun是用C語言實現和編譯了,在調用的時候,采用與C語言一樣的方式來編譯。該方法可以通過extern “C”來實現(具體用法見下面)。一般,在用C語言實現函數的時候,要考慮到這個函數可能會被C++程序調用,所以在設計頭文件時,應該這樣聲明頭文件:
/*頭文件a_module.h*/
/*頭文件被CPP文件include時,CPP文件中都含有該自定義的宏__cplusplus*/
/*這樣通過extern “C”告訴C++編譯器,extern “C”{}里包含的函數都用C的方式來編譯*/
#ifdef __cplusplus
extern “C”
{
#endif
extern void fun(int a, int b);
#ifdef __cplusplus
}
#endif
extern "C"的使用方式
1、可以是單一語句
extern "C" doublesqrt(double);
2、可以是復合語句, 相當于復合語句中的聲明都加了extern "C"
extern "C"
{
double sqrt(double);
int min(int, int);
}
3、可以包含頭文件,相當于頭文件中的聲明都加了extern"C"
extern "C"
{
#include <cmath>
}
4、不可以將extern"C" 添加在函數內部
5、如果函數有多個聲明,可以都加extern"C", 也可以只出現在第一次聲明中,后面的聲明會接受第一個鏈接指示符的規則。
6、除extern"C", 還有extern "FORTRAN" 等。
問題(五):sizeof關鍵字的作用?
答:
sizeof是在編譯階段處理,且不能被編譯為機器碼。sizeof的結果等于對象或類型所占的內存字節數。sizeof的返回值類型為size_t。
變量:int a; sizeof(a)為4;
指針:int *p; sizeof(p)為4;
數組:int b[10]; sizeof(b)為數組的大小,4*10;int c[0]; sizeof(c)等于0
結構體:struct (int a; char ch;)s1; sizeof(s1)為8 與結構體字節對齊有關。
注意:不能對結構體中的位域成員使用sizeof
sizeof(void)等于1
sizeof(void *)等于4
填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!