令你感到迷惑的C問題

2021-10-03 10:05:51 字數 4886 閱讀 2998

以下c程式的預期輸出是列印陣列中的元素。 但是當實際執行時,它不會這樣做

#include

#define total_elements (sizeof(array) / sizeof(array[0]))

int array=

;int

main()

它看起來似乎沒有問題,但當你執行的時候會出現以下的說明

comparison of integer expressions of different signedness: 『int』 and

『long long unsigned int』 [-wsign-compare]

翻譯以下:有符號性的整數表示式的比較:「 int」和「 long long unsigned int」 [-wsign-compare]

d <= (total_elements-2)dint型,total_elementslong long unsigned int型,雖然為警告資訊,但程式卻輸出不了任何內容

下面的程式是乙個完美的c程式。但是在編譯時,卻存在乙個愚蠢的錯誤

#include

void

os_solaris_print()

void

os_windows_print()

void os_hp-

ux_print()

intmain()

return0;

}

錯誤void os_hp-ux_print()os_hp-ux_print()的表達出現了不應該的符號-,切記,切記在c語言中-不可以出現,除了注釋

以下程式的預期輸出是多少?為什麼?

#include

enum

;int

main()

while

(false)

;return0;

}

**解釋:列舉是c語言中的一種基本資料型別,它可以讓資料更簡潔,更易讀。列舉語法定義格式為:enum 列舉名,如果沒有enumdo{}while(false)將會報錯

輸出:1 解釋:do{}while語句先執行後做判斷

下面的程式「似乎」不會列印「hello-out」

#include

#include

intmain()

return0;

}

執行程式,得到下面的結果

hello-out hello-err hello-out hello-err hello-out hello-err 。。。

為什麼?我不清楚

僅通過檢視程式,您「可能」會期望輸出是相同的,這兩個printf語句也是如此

#include

#define f(a,b) a##b

#define g(a) #a

#define h(a) g(a)

intmain()

但是實際的輸出卻是

12

f(1, 2)

解釋說明:c語言中,a##b表示將a和b連線起來,#a是將a字串化。在類似函式的巨集**現的引數(除非它是#或##的運算元)會在替換它並重新掃瞄整個以進行進一步擴充套件之前進行擴充套件。因為g的引數是#的運算元,所以引數不會展開,而是立即被字串化(「f(1,2)」)。因為h的引數不是#或者##的運算元,所以首先擴充套件引數(12),然後替換(g(12)),然後重新掃瞄並進一步擴充套件(「12」)

您認為下面程式的輸出是什麼?為什麼?

#include

intmain()

程式輸出:1.000000f is not 1.0。這是計算機中浮點數機制導致的,浮點數是乙個麻煩的thing

我認為下面的c程式是完全有效的(在閱讀了c中的逗號操作符之後)。

但是下面的程式有錯誤,你能找出來嗎?

#include

intmain()

解釋說明:int a = 1, 2會有錯誤的表示,正確的大概應該是這樣子int a, b = 2

下面的c程式的輸出是什麼?(它是有效的c程式嗎?)

#include

intmain()

解釋說明:首先執行括號最裡面的printf("%d", i),執行結果是43,此時printf("%d", i)的值是2,因為printf()函式的返回值是是輸出的字元個數,輸出"4"和"3"兩個字元,所示printf("%d", i)的值是2,printf("%d", printf("%d", i))輸出的是2,只有"2"這乙個字元,所以printf("%d\n", printf("%d", printf("%d", i)))輸出的1

下面的兩個函式原型一樣嗎?

int

foobar

(void);

intfoobar()

;

不一樣,foobar(void)的引數必須是空(void),foobar()的引數可有可無

以下程式的輸出是什麼?為什麼?

#include

intmain()

程式輸出

0

121095237632

解釋說明:浮點數是4個位元組,12.5f 轉成二進位制是:01000001010010000000000000000000,十六進製制是:0x41480000,十進位制是:1095237632

首先:float和double的記憶體布局,如下:

float: 1位符號位(s)、8位指數(e),23位尾數(m,共32位)

double: 1位符號位(s)、11位指數(e),52位尾數(m,共64位)

然後:printf由於型別不匹配,所以會把float直接轉成double,注意,12.5的float和double的記憶體二進位制完全不一樣。

接著:在x86晶元下使用是的反位元組序,高位位元組和低位字位要反過來

所以12.5的雙版本表示如下:

float版:0x41480000 (在記憶體中是:00 00 48 41)

double版:0x4029000000000000 (在記憶體中是:00 00 00 00 00 00 29 40)

%d要求是乙個4位元組的int,對於double的記憶體布局,我們可以看到前四個位元組是00,所以輸出自然是0了

額外的:這個示例說明了printf並不是型別安全的,這就是為c++要引入cout的原因了

解釋以下c程式的輸出(輸出b不是20)

#include

intmain()

return0;

}

解釋說明:

switch

(a)

switch-case語句會跳過switch與case之間的語句

以下程式的輸出是什麼?(同樣,它不是40(如果整數的大小是4))

#include

#define size 10

void

size

(int arr[size]

)int

main()

解釋說明:c語言下,sizeof的可能大小

short x

sizeof

(float)=

4sizeof

(void(*

)(void))

=8sizeof

(char[10

])=10

sizeof

'a'=

4sizeof

&main =

8sizeof

"hello"=6

sizeof x =

2sizeof

(x+1)=

4

arr表示陣列的首位址,位址的大小就是8

下面的c程式有什麼潛在問題?

#include

intmain()

潛在問題1:輸入了超過80個長度的字元,那麼就會有陣列越界的問題了,程式很有可以會崩潰;潛在問題2:輸入的字串有空格等一些字元,那麼程式的只輸出空格等這些字元之前的字元,比如hello world程式輸出的是hello

下面的程式的輸出是什麼?

#include

intmain()

解釋說明:第三個為什麼輸出的不是11,而是10呢原因是,sizeof不是乙個函式,是乙個操作符,其求i++的型別的size,這是一件可以在程式執行前(編譯時)完全的事情,所以sizeof(i++)直接就被4給取代了,在執行時也就不會有了i++這個表示式

C 中的預處理指令,你用了多少?

c 中的預處理指令 作為預處理中的一對 region name endregion可能是大家使用得最多的,我也常用它來進行 分塊,在乙個比較長的cs檔案中,這麼做確實是一件可以讓你使 更清晰的好辦法,vs也自動用這個來包含自動生成的 它這麼做既可以使開發人員更清晰的檢視自己的 也開了乙個好頭,使更多...

C 中的預處理指令,你用了多少?

c 中的預處理指令 作為預處理中的一對 region name endregion可能是大家使用得最多的,我也常用它來進行 分塊,在乙個比較長的cs檔案中,這麼做確實是一件可以讓你使 更清晰的好辦法,vs也自動用這個來包含自動生成的 它這麼做既可以使開發人員更清晰的檢視自己的 也開了乙個好頭,使更多...

C語言的迷惑行為 指標和const

指標 const你去哪!const 我去哪不重要,我在哪才重要。指標是c語言的靈魂。const是c語言的乙個限定修飾符。當他們兩個結合在一起時,會發生很多有趣的事情。在c語言裡,const和指標型別變數會組合為下面的形式 const int ptr intconst prt int const pt...