1.以下程式的運作結果是()
int main(void) {
printf("%s , %5.3s\n","computer","computer");
return 0;
}
A computer , puter
B computer , com
C computer , computer
D computer , compu.ter
解析:題示代碼中的%5.3s ,其具體的格式應該是:
%m.ns
其中,m表示輸出字元串的寬度,如果字元串不夠,則在左側補空格
n表示左起截取目标字元串的n個字元,如果字元串長度小于n,就輸出原字元串
int main() {
printf("123456789abcdef\n");
printf("%15s", "comptuer");
printf("END\n");
printf("%1s", "comptuer");
printf("END\n");
printf("%.4s", "comptuer");
printf("END\n");
printf("%.15s", "comptuer");
printf("END\n");
printf("%15.4s", "comptuer");
printf("END\n");
printf("%15.15s", "comptuer");
printf("END\n");
return 0;
}

我們可以通過以上結果進行一些簡單驗證。
2.使用printf函數列印一個double類型的資料,要求:輸出為10進制,輸出左對齊30個字元,4位精度。以下哪個選項是正确的?
A %-30.4e
B %4.30e
C %-30.4f
D %-4.30f
解析:這道題算是上一道題的一個補充:
%m.ns中m關于左右對齊的設定
當m大于0的時候,為右對齊,m小于0的時候,為左對齊。
int main() {
printf("123456789abcdef\n");
printf("%-15s", "comptuer");
printf("END\n");
printf("%15s", "comptuer");
printf("END\n");
return 0;
}
說簡單點就是m>0,且m大于字元串長度時,在字元串左邊補空格,m<0,且m大于字元串長度時,在字元串右邊補空格。
另外,補充一個小知識:
%d 整型輸出,%ld長整型輸出。
%o 以八進制數形式輸出整數。
%x 以十六進制數形式輸出整數。
%u 以十進制數輸出unsigned型資料(無符号數)。
%c 用來輸出一個字元。
%s 用來輸出一個字元串。
%f 用來輸出實數,以小數形式輸出。
%e 以指數形式輸出實數。
%g 根據大小自動選f格式或e格式,且不輸出無意義的零。
//舉幾個簡單的小例子
int main() {
printf("%e\n", 13.2);
printf("%g\n", 13.2);
printf("%g\n", 0.00000043);
return 0;
}
3.下面程式輸出是什麼?
#include <stdio.h>
int main()
{
int a=1,b=2,c=3,d=0;
if(a == 1 && b++==2)
if(b!=2||c--!=3)
printf("%d,%d,%d\n" ,a,b,c);
else
printf("%d,%d,%d\n" ,a,b,c);
else
printf("%d,%d,%d\n" ,a,b,c);
return 0;
}
A 1,2,3
B 1,3,2
C 3,2,1
D 1,3,3
解析:這道題的重點就在于&&與||的短路原則,之前往往碰到的是&&的短路,反倒把||的短路給忘了,錯的着實不該。
&&的短路原則:
若要使(表達式1)&&(表達式2)為真,就要使表達式1與表達式2都為真,但如果表達式1為假,編譯器會跳過對表達式2的判斷
||的短路原則:
若要使(表達式1)||(表達式2)為真,則需要表達式1或者表達式2為真,是以當表達式1為真時,編譯器會跳過表達式2.
4.設變量已正确定義,以下不能統計出一行中輸入字元個數(不包含回車符)的程式段是
A n=0;while(ch=getchar()!='\n')n++;
B n=0;while(getchar()!='\n')n++;
C for(n=0;getchar()!='\n';n++);
D n=0;for(ch=getchar();ch!='\n';n++);
解析:咳咳......全體目光向我看齊,我是個@#
for循環的初始化部分隻執行一次。
5.假設在一個 32 位 little endian 的機器上運作下面的程式,結果是多少?
#include <stdio.h>
int main(){
long long a = 1, b = 2, c = 3;
printf("%d %d %d\n", a, b, c);
return 0;
}
A 1,2,3
B 1,0,2
C 1,3,2
D 3,2,1
解析:這道題所考察的是計算機大小端存儲相關的知識:
大端存儲:低位存在高位址
小端存儲:低位存在低位址
由于做題的時候太馬虎,以至于沒有看出long long型與%d之間的坑。
long類型可能在不同的作業系統下,不同的編譯器下長度可能不同,但long long類型卻是公認的占用8個位元組的類型。
題中給出了作業系統是32位little endian(小端)作業系統,是以 1 在該機器上的存儲應該是:
0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
(好長啊......)低位址-->高位址
而%d是隻讀取4個位元組(按照int類型讀取的,long long 應該用%ld)。
由以上條件,易得,答案為1,0,2
最後,是我個人感覺需要提醒自己一下的一個零碎知識點。
在C語言中,多元數組初始化時,隻有第一維可以省略。