1.設x、y、z和k都是int型變量,則執行表達式:x=(y=4,z=16,k=32)后,x的值為(32);
? ? ? ? x=(y=4,z=16,k=32),x的值為32
理解逗號運算符在c語言中的工作方式:逗號運算符從左到右執行其操作數,并返回最右邊的操作數作為結果
2.?2、對于一個正常運行和正常退出的C程序,程序從main函數第一條可執行語句開始執行,在main函數結束!
3.設x和y均為int型變量,則以下語句:x+=y;y=x-y;x-=y;的功能是:交換x和y中的值;
x+=y? ? ? ? 相當于把x與y的和重新賦值給x
y=x-y? ? ? ?相當于把x-y的值為x賦值給y
x-=y? ? ? ? ?相當于把x-y的值為y賦值給x
所以x與y的值交換!
?4.假定有以下變量定義:? int k=7,x=12;則能使值為3的表達式是:(x%=k)-(k%=5)
1.%=是取模和賦值運算符:先進行取模運算,然后將結果賦值給左邊的變量
2.- 是減法運算符
?5.以下程序的輸出結果是:12 13
????????????????main( )
{ int a=12,b=12;
printf(“%d %d\n”,a--,++b);
}
a--這是一個后綴遞減操作,首先返回a的當前值,然后a的值再減少1
++b這是一個前綴遞增操作,首先增加b的值,然后返回增加后的值
?6.設有聲明語句“int a=1,b=0;”,則執行以下語句后輸出為:**0****2**
?????? switch(a)
?????? {
????????? case? 1:
???????????? switch(b)
?????????????? {case? 0: printf(“**0**”); break;
??????????????? case? 1: printf(“**1**”);break;
??????????????? }
????????? case?? 2: printf(“**2**”);break;
???????? }
首先:我們來看這個嵌套的switch-case結構
外層switch語句判斷條件是a
1.當a的值為1時,進入第一個case:1的代碼塊
? ? ? ? 在這個代碼塊中,有一個內層的switch語句,其判斷條件是b;
? ? ? ? 因此b的值為0,所以執行case 0:的代碼塊,輸出**0**;
此時,由于case 0 :后面有break語句,所以跳出內層的switch語句。
但是,由于外層switch語句的case 1:后面沒有break語句,程序會繼續執行下一個case,也就是case 2:的代碼塊,輸出**2**;
因此,結果為**0****2**
7.以下程序輸出結果是? 6
main( )
{ int m=5;
if(m++>5)printf(“%d\n”,m);
else printf(“%d\n”,m--);}
if(m++>5):這是一個后自增加操作。首先,比較m此時為5是否大于5,然后m自增加1.因此,判斷條件為假。
因為條件為佳,所以執行else語句:printf("%d\n",m--); 這是一個后自減操作。首先打印m的值再自減1;
所以輸出結果為:6
在C++和許多其他編程語言中,i++
和++i
都是對變量i
進行自增操作,但它們的使用方式和效果略有不同。
i++
: 這是后置自增操作。它首先返回i
的當前值,然后將i
的值加1。例如,如果i
是5,那么執行j = i++
后,j
的值將是5,而i
的值將變為6。++i
: 這是前置自增操作。它首先將i
的值加1,然后返回新的值。例如,如果i
是5,那么執行j = ++i
后,j
的值將是6,而i
的值也將是6。
這兩種操作在大多數情況下可以互換使用,但它們在某些特定場景下可能會有細微的差別。例如,當與復雜的表達式或函數一起使用時,前置和后置自增操作的順序可能會影響結果。因此,選擇使用前置自增還是后置自增應根據具體的需求和上下文來決定。
8.當執行以下程序段時:循環體將執行一次
????????x=-1;
do { x=x*x;}
while(!x);
循環體執行的次數是由循環條件絕對的:
? ? ? ? 在這個程序中,循環條件是!x,只要這個條件為真,循環就會繼續執行。但是在第一次循環迭代中,x的值從-1變為1(x=x*x);然后!x的值為0(假),所以循環終止了,因此,循環體只執行了一次!
9.?在函數調用過程中,如果函數funA中又調用了函數 funA,則:稱為函數的直接遞歸調用
直接調用是指一個函數的函數體中含有調用自身的語句。這種情況下,函數funA在其定義中直接調用了自身!
間接調用是指一個函數在函數體里面有調用了其它函數,而其它函數反過來調用了該函數的情況。在這種情況下,函數funAbing沒有在其定義中調用了其它函數,而是直接調用了自身。
直接調用:調用了自身語句
間接調用:調用了其他函數
遞歸函數:
? ? ? ? 是指一個函數的函數體中直接或間接調用了該函數自身的函數。在上述情況中,由于funA在其定義中直接調用了自身,所以它是一個遞歸函數。
10、以下程序運行后,輸出結果是:8,17
func(int a,int b)
{ static int m=0,i=2;
i+=m+1;
m=i+a+b
return(m);
}
main()
{ int k=4,m=1,p;
p=func(k,m);printf(“%d,”,p);
p=func(k,m);printf(“%d\n”,p);
}
分析:
? ? ? ? 第一個func函數體里面?初始化m為0,i為2;
????????????????i+=m+1相當于i=i+m+1;? ? ? ? i值為3;
????????????????m=i+a+b相當于m=3+a+b;????????
? ? ? ? main函數
????????????????把k=4,m=1,值傳給func函數
? ? ? ? 第一個p為:
? ? ? ? ? ? ? ? i=i+m+1=2+0+1;??
? ? ? ? ? ? ? ? m=i+a+b=3+4+1=8
? ? ? ? 第二個p為:
? ? ? ? ? ? ? ?i=i+m+1=3+8+1=12
? ? ? ? ? ? ? ?m=i+a+b=12+4+1=17
? ? ? ?
`static` 是C、C++、Java、C#等許多編程語言中的一個關鍵字,它具有多種用途。以下是`static`的一些主要含義和用途:
1. **靜態變量**:當一個變量前有`static`關鍵字時,這意味著這個變量的生命周期是整個程序的執行期間,而不是它所在的代碼塊。此外,靜態變量只會被初始化一次,且其值在程序的整個生命周期中保持不變。
static int x = 0; ?// 只在程序開始時初始化一次
2. **靜態方法**:當一個方法前有`static`關鍵字時,這意味著這個方法不需要類的實例就可以調用。靜態方法只能訪問靜態變量或其他靜態方法。
static void myStaticMethod() {
?
}
3. **靜態類**:在C#中,整個類都可以被聲明為`static`。這樣的類不能被實例化,并且只能包含靜態成員。
public static class MyStaticClass {
}
4. **靜態成員的訪問**:靜態成員可以通過類名直接訪問,而不需要創建類的實例。
MyClass.myStaticMethod(); ?// 訪問靜態方法
5. **局部變量**:在C和C++中,`static`關鍵字也可以用于局部變量,這意味著這個變量的生命周期是整個程序執行期間,而不是它所在的代碼塊。這與全局變量類似,但它的作用范圍被限制在其聲明所在的代碼塊內。
6. **其他用途**:在C++中,`static`還可以用于聲明靜態指針、靜態數組等。在Java中,它可以用于聲明靜態塊等。理解并正確使用`static`關鍵字對于編寫高效的、可維護的代碼是非常重要的。但也要注意,過度使用或不恰當使用`static`可能會導致代碼難以理解和維護。