C 語言隨筆之測試題

1.下面代碼的輸出

void foo(void)
{
unsigned int a = 6;
int b = -20;
(a + b > 6)? puts(">6"): puts("<=6");
}

在進行加法運算時候 int 型轉換成unsigned int 型。編譯器會把b當成一個很大的數。在此函數中,a + b 屬於隱式轉換,有符號的要轉換成無符號的。把int類型的轉換成unsigned的,要根據計算機中存儲數據的是補碼,進行轉換然後計算可得。4294967295沒錯,就是int類型的最大值。

void foo(void)
{
unsigned i;
for(i = 9; i >= 0; i--)
{
printf("%u\n",i);
}
}

下面看這段代碼,根據上一題,在進行unsigned  i = 9的時候,進行了類型轉換,無符號數變成那個超大數,無限循環。

2、下面代碼中的錯誤。

void foo(void)

{

char string[10],str[10];

int i ;

for(i = 0; i < 10; i++)

{

str1[i] = 'a';

}

strcpy(string,str1);

printf("%s“,string);

}

這就涉及到str類型函數的共性,在操作字符串的時候,一般的界限都是遇到'\0'的時候截止。但是在str1賦值的時候並沒有制定字符串的末尾,所以在str1數組結束之後不能確定下一字節內存存的是什麼。極有(一定)可能出錯。

並且對於printf函數輸出字符串類型的值得時候,也是等到‘\0’結束符位置,所以同樣會有錯誤。

3.下面代碼 i,j值分別是什麼。

static int j;

int k = 0;

void fun1(void)

{

static int i = 0;

i ++;

}

void fun2(void)

{

j = 0;

j++;

}

int main()

{

for(k = 0;k < 10;k++)

{

fun1();

fun2();

}

return 0;

}

 i  = 10; j = 1

首先看i,i在函數中被聲明爲,static int 那麼這個變量就被存放在內存的靜態區,所以即使這個函數運行結束靜態變量也不會被銷燬,函數下次使用的時候仍然是被改變後的那個值,在本題中,i就不停的加,知道循環結束。而j則不是在fun2函數內部每次都要給j進行初始化,所以你懂得的。

4.在下面代碼中,假設在32位系統下。

int *p = NULL;

sizeof(p) = 4;

sizeof(*p) = 4;

int a[100];

sizeof(a)  = 100;

sizeof(a[100]) = 4;

sizeof(&a) = 4;

sizeof(&a[0])  = 4;

int b [100];

void fun(int b [100])

{

sizeof(b);

}

sizeof(b) = 4;

答案已經在上面了。要明確一點,指針佔四個字節,int 類型佔四個字節。

其次對於數組和指針的關係。要重點說一下。數組是一種使用下表變量的數據類型,它可以表示大量相同性質的值。在C語言中,數組和指針是兩個緊密相關的概念。數組名本身就被當成常量指針看待,而且指針與數組一樣可以用下表來進行訪問。、

不同:指針變量可以取不同的地址作爲它的值,單數數組名本身就是一個地址,他是固定的。當一個數組被聲明時候,編譯器必須在內存中分配足夠數量的連續空間來包含數組的所有元素,數組的基地址就是這個數組在內存中的起始地址。他也是數組第一個元素的地址。當一個數組名作爲sizeof的參數的時候他代表的是整個數組。當在函數內部聲明一個參數 函數的參數在內存中存在棧中,當fun函數被調用的時候,傳遞過來的參數是一個數組指針,此時b就被賦值爲數組指針,

5.,int main(int argc, char* argv[])
{
 signed char a[1000];
int i;
for(i = 0;i < 1000; i ++)
{
a[i] = -1-i;
}
printf("%d",strlen((const char*)a));
return 0;
}

signed char表示的最大值是-128當a[i]變成-129的時候,發生了溢出,char類型有8位,高位被丟棄,當加到-256的時候,低八位爲0所以遇到結束標誌,輸出此時大小。255

發佈了29 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章