第一題
1. 已知int i=1, j=2;,則表達式i+++j的值為( )
A:1
B:2
C:3
D:4
答案及解析?C
本題考查的是前置++和后置++的優先級,后置++的優先級是高于前置++的,所以這個表達式就可以轉變為:(i++) + j?
而后置++的返回值是++之前的值,所以結果就為3;
第二題
2. 假定有定義為“?int a[10], x, *pa=a;?”,若要把數組?a?中下標為?3?的元素值賦給?x?,則不正確的賦值為?(?)
A:x=pa[3]
B:x=*(a+3)
C:x=a[3]
D:x=*pa+3
答案及解析 D
A:pa是指向的a數組的首元素地址,所以pa就相當于數組名,pa[3]正確;
B:*(a+3)就是讓a指針向后移動3個元素,到下標為3的位置,再解引用,正確;
C:正確;
D:*的優先級高,先解引用pa,取到的是首元素的值,+3就是首元素的值?3,錯誤;
第三題
3. 若已定義的函數有返回值,則以下關于該函數調用的敘述中錯誤的是()
A:函數調用可以作為獨立的語句存在
B:函數調用可以作為一個函數的實參
C:函數調用可以出現在表達式中
D:函數調用可以作為一個函數的形參
答案及解析 D
A:函數的調用可以是獨立的語句,比如我們實現的函數不需要返回值,只是完成一些特定的操作,如打印,交換,輸入等等;
B:函數調用可以作為實參,但是必須有返回值的函數;
C:函數調用可以出現在表達式,也必須有返回值;
D:返回值存在寄存器中,沒有地址,不能作為形參,但可以作為實參
第四題
4. 在32位的系統中,下面代碼打印結果為()
union package
{char head;int body;
};
struct message
{char id;int crc;union package pack;
};int main()
{printf("size=%d\n",sizeof(struct message));return 0;
}
A:9
B:10
C:11
D:12
答案及解析 D
做錯的直接來看我的這個博客C/C++內存對齊規則(結構體、聯合體、類)-CSDN博客
第五題
5. 32位機器上,以下代碼的輸出是()
char?c?=?-1;
int?i0?=?c;
int?i1?=?(unsigned?char)c;
printf("%d,?%d\n",?i0,?i1);
A:255,255
B:-1,-1
C:-1,255
D:255,-1
答案及解析?C?
這里考察的是char的取值范圍是-127~128
而unsigned char是0~255
所以i0 = c,會有整型提升,也就是原來8個bit位的char類型,會提升位int類型,32的bit,高位補符號位;
11111111 111111111 11111111 11111111
而我們強制類型轉換c位unsigned char 也就是不允許負數的存在了,所以-1的符號位,也就是數值位了。11111111就是255
i1 = (unsigned char)c,對于無符號的整型提升,高位補0
00000000 00000000 00000000 11111111
依舊是255;