第一題
1. 下面程序輸出的結果是()
#include <stdio.h>
int main ()
{int x;x = printf("I See, Sea in C");printf("x=%d" , x);
}
A:2
B:隨機值
C:都不是
D:15
答案及解析 D
printf函數的返回值是int類型,返回的是打印出的字符的個數,并且printf遇到\0結束打印,所以題中共有15個字符,x就為15;
詳情可以看這里:printf返回值的定義與舉例-CSDN博客
第二題
2. 求函數返回值,輸入x=9999
int func(int x)
{int count = 0;while (x){count++;x = x&(x - 1);}return count;
}
A:8
B:9
C:10
D:12
答案及解析 A
本題有一個位運算的公式,x & (x - 1)可以消除最右側的1,使其變為0;所以這個while循環的作用就是看x有多少個1的;
9999的二進制位:10011100001111
一共有8個1,所以返回的就是8
第三題
3. 下面程序的1,2,3處表達式的值為()
int main()
{int n = 1;++n;n++; // 1--n; // 2++n; // 3return 0;
}
A:2 2 3
B:2 2 2
C:2 3 2
D:2 1 1
答案及解析 A
本題考查的是前置++和后置++ 的區別;
前置++,返回的是++之后的值,后置++返回的是++之前的值;--也是;
別忘了1處上面有個++n;
所以1處:表達式的值為2,但是n = 3;
2處:表達式的值為2,n = 2;
3處:表達式的值為3,n = 3;
在C++中的運算符重載就很好地可以看出,前置++和后置++的區別;前置++返回的就是++之后的值,而后置++,是將這個數拷貝了一份返回去,但是這個數自身已經增加1了;
A& operator++(){*this += 1;return *this;}A operator++(int){A copy = *this;*this += 1;return copy;}
第四題
4. 有如下代碼段:
char x[ ]="abcdefg";
char y[ ]={'a','b','c','d','e','f','g'};
則正確的敘述為()
A:數組 x 和數組 y 等價
B:strlen(x) > strlen(y)
C:strlen(y) >= strlen(x)
D:sizeof(y) > sizeof(x)
答案及解析 C
A:錯誤,x是一個字符串,而y是一個字符數組,字符串和字符數組的區別就是末尾有沒有隱藏的\0,字符串末尾一定是有一個隱藏的\0,但是字符數組的\0的具體位置是隨機的;
B錯C對:因為strlen函數是求字符串長度的,其中只有遇到\0才會停止計算,然后返回\0之前的字符個數,上面也說了,y這個字符數組的\0的位置是不確定的,所以可能在末尾,也可能在更之后,所以strlen(y) >= strlen(x)的;
D:錯誤,x的大,這個是計算占用多少內存的,x有個隱藏的\0也是申請空間了的;
第五題
5. 有以下定義和語句,則 *( p[0] + 1) 所代表的數組元素是()
int?a[3][2]?=?{1,?2,?3,?4,?5,?6},?*p[3];
p[0]?=?a[1];
A:a[ 0 ][ 1 ]
B:a[ 1 ][ 0 ]
C:a[ 1 ][ 1 ]
D:a[ 1 ][ 2 ]
答案及解析 C?
首先,int *p[ 3 ]是一個指針數組,因為[ ]的優先級高,所以會先形成數組,然后每個元素的類型是int*;其次p [ 0 ]存的是a[ 1 ]的地址,a[ 1 ]代表的是這個二維數組第二行的首元素地址;因為a[ 1 ][ 2 ]相當于的就是第二行這個一維數組,a[ 1 ]就是這個一維數組的數組名,數組名代表首元素地址,也就是a[ 1 ][ 0 ]的地址;
p[ 0 ] <==> a[ 1 ] <==> &a[ 1 ][ 0 ]
p[ 0 ] + 1 <==> &a [ 1 ][ 0 ] + 1 <==> &a[ 1 ][ 1 ]
*(p[ 0 ] + 1)? <== > a[ 1 ][ 1 ]
?