專項小練(三)
1 函數形參
形參與實參:C語言中,所有函數參數都是"通過值"傳遞的,傳遞給被調用函數的參數值存放在臨時變量中,被調用函數不能直接修改主調函數中變量的值,而只能修改其私有的臨時副本的值。
指針參數:調用者可向被調用函數提供帶設置值的變量地址即指針變量,被調用函數將對應參數聲明爲指針類型,並通過它間接訪問;
數組參數:當把數組名用作參數時,傳遞給函數的值是數組起始元素的位置或地址,通過數組下標可訪問或修改數組元素的值。
函數調用語句func(rec1,rec2+rec3,(rec4,rec5));中的實在參數的個數是( 3 )。
函數調用的形式: 函數名(實參1,實參2,實參3 ,… ,實參n)
實參可以是具有確定值的常量、變量、表達式、函數等,rec1是一個變量。rec2+rec3是一個表達式。(rec4,rec5)爲逗號運算符,優先級別最低,逗號表達式的值是最後一個表達式的值。
2 若整型變量x的初值爲6,則計算表達式“x+=x-=x*x”之後,x的值是(-50)
考察賦值運算符
賦值運算是從右往左,
x+=x-=x*x x=6
x*x=36
x-=x*x 即爲x=x-x*x,此時x=6-36=-30
x+=x-=x*x 即爲x=x+(-30) =-30+(-30)=-60
3 以下哪個屬於在預編譯階段執行____,以下哪些指令屬於操作符___
a:malloc;
b:++;
c:#pragma;
d:sizeof;
e:#define
預編譯c,e 操作符b,d
帶#的肯定是預編譯指令了,故c和e預編譯;sizeof爲操作符,如"+,-"等,malloc爲函數,參數爲字節數,返回一個void* 指針。
4 若a、b、c1、c2、x、y均是整型變量,正確的switch語句
switch(a+b)
{
case 1:y=a+b;break;
case 0:y=a-b;break;
case 3:y=b-a;break;
}
考察點:switch語句格式
5 靜態外部變量只在本文件內可用
靜態變量
靜態變量如何跨文件訪問?
走位崴了腳:全局變量(函數外定義)分爲:(1)靜態全局變量(外部靜態變量,static int a;)和(2)外部全局變量(extern int a;),extern可以省略。靜態全局變量的作用域爲本文件,限制別的文件訪問,外部全局變量可以被其他文件引用
說法是否有誤??
6 程序中, int32-t 表示一個有符號的 32 位整數,程序的入口是 main 函數,問最終 res 的結果是多少?
int32_t f(int_32_t a,int32_t b){
while(a+b>0){
a = a+1;
b = b+1;
}
return a+b;
}
int32_t main(){
int32_t res = f(1,0);
}
TheBestIsYetToCome-
@ 羽落長安 的解析不錯,以char爲例
f(1,0):
a=2 b=-1
a=3 b=-2
…
a=127 b=-126
a=128 b=-127 溢出–>a=-128 b=-127 char範圍:-128~127
return a+b:-128-127實際上是1(char範圍),繼續循環
而原例爲int_32t,臨界情況 a+b: -232+(-232+1)=1,也繼續循環。
因此死循環。
unsigned int、int32_t long int???
7
int a[3];
a[0] = 0; a[1] = 1; a[2] = 2;
int *p, *q;
p = a;
q = &a[2];
則a[q - p] = ?
yj129
這裏q-p的實際運算是:(q的地址值-p的地址值)/sizeof(int),所以爲2.
基礎數據類型在32、64位操作系統?(處理器)中差異
怎麼不同位數處理器中是怎麼存儲及運算的?
舉例在 32 位編譯器上,設有定義
char *str1 = “Hello”, str2[] = “Hello”; ,
則以下語句 printf("%d %d", sizeof(str1), sizeof(str2)); 的輸出結果是(4,6)
考查了指向字符串的指針和字符數組, str1 爲一個字符指針,所以 sizeof 爲 4 , str2 爲字符數組,其中包含 6 個字符,所以答案爲 4 6 。
8 引用可以是void類型嗎?
不可以
huixieqingchun
引用只是一個別名,是已有變量的別名,而void類型是空類型,是沒有分配內存的。所以引用不能是void類型 。
8 7&3+12的值是15。請問這個說法是正確的嗎?錯誤
考察C語言運算符優先級
1. () [] . ->
2. ! ~ ++ -- + - * & (type) sizeof
3. * / %
4. + -
5. >> <<
6. > >= < <=
7. == !=
8. &
9. ^
10. |
11. &&
12. ||
13. ? :
14. = *= /= %= += -= >>= <<= &= ^= |=
15. ,
9 程序指向結果
#include "stdio.h"
class A
{
public:
virtual void Test()
{
printf("A test\n");
}
};
class B: public A
{
public:
void func()
{
Test();
}
virtual void Test()
{
printf("B test\n");
}
};
class C: public B
{
public:
virtual void Test()
{
printf("C test\n");
}
};
void main()
{
C c;
((B *)(&c))->func();
((B)c).func();
}
查考虛函數
kchenhao
查閱了各種資料,我來說一下我的看法吧:
(1)((B *)(&c))->func():編譯階段,系統發現B類型有一個非虛函數func,靜態綁定,相當B::func((B *)(&c)),傳入的this指針是B類型。在func內部調用this->Test(),由於Test是虛函數,動態綁定,通過虛函數表調用C::Test()。
(2)((B)c).func():強制類型轉換髮生對象切割,相當於用C初始化一個臨時對象Btemp,vptr指向B的虛函數表,等價於Btemp.func()。根據靜態綁定,調用B::func((B *)Btemp),在func內部調用this->Test(),Test是虛函數,動態綁定,通過虛函數表(注意此時的虛函數表是B)調用B::Test()。
10 由3 個“1”和 5 個“0”組成的 8 位二進制補碼,能表示的最小整數()
既然求最小整數,那肯定先想到負數,則最高位(符號位)一定爲1,原碼中肯定是1所在的位數越高,值越小,而補碼是由原碼取反加1得到的,則在補碼中1所在的位數一定要越低,即補碼爲1000 0011;由補碼求得原碼:1111 1101=-(64+32+16+8+4+1)=-125;
考查原碼、補碼、反碼概念及???
11 一張1024×640分辨率的圖片,假定每個像素用16位色彩表示,用位圖文件(bitmap)格式存儲,則這張圖片文件需要佔用多大的存儲空間_
102464016 bit = 102464016/8 B = 102464016/8/1024 KB = 1280KB
12 在32位系統中,下面程序打印結果爲()
#include<iostream>
using namespace std;
class A
{
char a[3];
public:
virtual void fun1(){};
};
class B : public virtual A
{
char b[3];
public:
virtual void fun2(){};
};
class C : public virtual B
{
char c[3];
public:
virtual void fun3(){};
};
int main ()
{
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
return 0;
}
13代碼輸出,print已聲明
main(){
char str[]="Geneius";
print (str);
}
print(char *s){
if(*s){
print(++s);
printf("%c",*s);
}
}
有兩個知識點,一個是遞歸,相當於棧是FILO,另一個考察點是print(++s),指針先移動然後調用函數。
14 #if defined() 和#if !defined()指令簡寫#ifdef #ifndef
阿道夫