天天看點

錯題彙總1

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;
}
           
錯題彙總1

 我們可以通過以上結果進行一些簡單驗證。

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;
}
           
錯題彙總1

說簡單點就是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;
}
           
錯題彙總1
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語言中,多元數組初始化時,隻有第一維可以省略。 

繼續閱讀