C經典筆試題之2

        1、局部變量能否和全局變量重名?

答:局部變量可以與全局變量同名,在函數內引用這個變量時,會用到同名的局部變量,而不會用到全局變量。對於有些編譯器而言,在同一個函數內可以定義多個同名的局部變量,比如在兩個循環體內都定義一個同名的局部變量,而那個局部變量的作用域就在那個循環體內

2
、如何引用一個已經定義過的全局變量?

答:可以用引用頭文件的方式,也可以用extern關鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變理,假定你將那個變寫錯了,那麼在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那麼在編譯期間不會報錯,而在連接期間報錯。(不要問我什麼是編譯期間,什麼是連接期間,請自己查資料)


3
、全局變量定義在可被多個.C文件包含的頭文件中可不可以?爲什麼?

答:可以,但要加static

4
、語句for( 1 )有什麼問題?它是什麼意思?

答:死循環,同while(1),這種寫法並不規範,可讀性差,一般不用

5
do……whilewhile……do有什麼區別?

答:前一個循環一遍再判斷,後一個判斷以後再循環

6
、請寫出下列代碼的輸出內容
#include
main()
{
int a,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("b
cd%d%d%d"bcd;
return 0;
}

答:1012120

7.static
函數與普通函數有什麼區別?

只在當前源文件中使用的函數應該說明爲內部函數(static),內部函數應該在當前源文件中說明和定義。對於可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件。

8.static
全局變量與普通的全局變量有什麼區別?

全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。全局變量本身就是靜態存儲方式,靜態全局變量當然也是靜態存儲方式。

這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。而靜態全局變量則限制了其作用域,即只在定義該變量的源文件內有效,在同一源程序的其它源文件中不能使用它。由於靜態全局變量的作用域侷限於一個源文件內,只能爲該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。從以上分析可以看出,把局部變量改變爲靜態變量後是改變了它的存儲方式即改變了它的生存期。把全局變量改變爲靜態變量後是改變了它的作用域,限制了它的使用範圍。

9.
程序的局部變量存在於(棧)中,全局變量存在於(靜態區)中,動態申請數據存在於(堆)中。

10.
設有以下說明和定義:
typedef union {long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;

則語句 printf("%d",sizeof(struct date)+sizeof(max));的執行結果是:___52____

11.
隊列和棧有什麼區別?

隊列先進先出,棧後進先出

12.
寫出下列代碼的輸出內容
#include
int inc(int a)
{
return(++a);
}
int multi(int*a,int*b,int*c)
{
return(*c=*a**b);
}
typedef int(FUNC1)(int in);
typedef int(FUNC2) (int*,int*,int*);

void show(FUNC2 fun,int arg1, int*arg2)
{
INCp=&inc;
int temp =p(arg1);
fun(&temp,&arg1, arg2);
printf("%d/n",*arg2);
}

main()
{
int a;
show(multi,10,&a);
return 0;
}


翻譯一下
==================================
#include
using namespace std;

//
返回a + 1
int inc(int a){
return a+1;
}
// out = a*b
int multi(int& a, int& b, int& out){
return out = a*b;
}

//
定義兩種函數,FUNC1對應inc, FUNC2對應 multi
typedef int(FUNC1) (int in);
typedef int(FUNC2) (int&,int&,int&);

//
詭異的函數,這是模糊C大賽麼...
void show( FUNC2* func, int num, int& out ){
FUNC1* pInc = inc;//
原文這句寫錯了...orz... INC根本沒定義
int numAdd1 = pInc( num );
//
等價於 numAdd1 = inc( num );
//
結果 num仍然是10, numAdd1 = 11

//
調用func函數,可以看到, main中傳給func的是 multi.
//
所以調用的是 multi( 11, 10, out ), out = 110
func( numAdd1, num, out );
cout<}

int main(){
int a;
show(multi,10, a);
return 0;
}
==================================

13.
請找出下面代碼中的所以錯誤

說明:以下代碼是把一個字符串倒序,如“abcd”倒序後變爲“dcba”
==================================
main(){
char*src="hello,world";
char* dest=NULL;

int len=strlen(src);
dest=(char*)malloc(len);//!1
少分配了一字節. strlen計數不包括/0

char* d = dest;
char* s = src[len];//!2
兩個錯誤. 應該爲 &src[ len-1 ]
while( len-- != 0 )
d++=s--;//!3 *d++ = *s--;
//!4
尾部要/0,應加上 *d = 0;

printf("%s",dest);
return 0;
}
==================================


修正後的答案:
==================================
int main(){
char* src = "hello,world";

int len = strlen(src);
char* dest = (char*)malloc(len+1);.

char* d = dest;
char* s = &src[len-1];
while( len-- != 0 )
*d++=*s--;
*d = 0;

printf("%s",dest);
return 0;
}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章