以下c程式的預期輸出是列印陣列中的元素。 但是當實際執行時,它不會這樣做
它看起來似乎沒有問題,但當你執行的時候會出現以下的說明#include
#define total_elements (sizeof(array) / sizeof(array[0]))
int array=
;int
main()
comparison of integer expressions of different signedness: 『int』 and翻譯以下:有符號性的整數表示式的比較:「 int」和「 long long unsigned int」 [-wsign-compare]『long long unsigned int』 [-wsign-compare]
即d <= (total_elements-2)
中d
為int
型,total_elements
為long 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 列舉名
,如果沒有enum
,do{}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解釋說明:c語言中,a##b表示將a和b連線起來,#a是將a字串化。在類似函式的巨集**現的引數(除非它是#或##的運算元)會在替換它並重新掃瞄整個以進行進一步擴充套件之前進行擴充套件。因為g的引數是#的運算元,所以引數不會展開,而是立即被字串化(「f(1,2)」)。因為h的引數不是#或者##的運算元,所以首先擴充套件引數(12),然後替換(g(12)),然後重新掃瞄並進一步擴充套件(「12」)f(1, 2)
您認為下面程式的輸出是什麼?為什麼?
程式輸出:1.000000f is not 1.0。這是計算機中浮點數機制導致的,浮點數是乙個麻煩的thing#include
intmain()
我認為下面的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
下面的兩個函式原型一樣嗎?
不一樣,foobar(void)的引數必須是空(void),foobar()的引數可有可無int
foobar
(void);
intfoobar()
;
以下程式的輸出是什麼?為什麼?
程式輸出#include
intmain()
0解釋說明:浮點數是4個位元組,12.5f 轉成二進位制是:121095237632
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-case語句會跳過switch與case之間的語句switch
(a)
以下程式的輸出是什麼?(同樣,它不是40(如果整數的大小是4))
解釋說明:c語言下,sizeof的可能大小#include
#define size 10
void
size
(int arr[size]
)int
main()
arr表示陣列的首位址,位址的大小就是8short x
sizeof
(float)=
4sizeof
(void(*
)(void))
=8sizeof
(char[10
])=10
sizeof
'a'=
4sizeof
&main =
8sizeof
"hello"=6
sizeof x =
2sizeof
(x+1)=
4
下面的c程式有什麼潛在問題?
潛在問題1:輸入了超過80個長度的字元,那麼就會有陣列越界的問題了,程式很有可以會崩潰;潛在問題2:輸入的字串有空格等一些字元,那麼程式的只輸出空格等這些字元之前的字元,比如hello world程式輸出的是hello#include
intmain()
下面的程式的輸出是什麼?
解釋說明:第三個為什麼輸出的不是11,而是10呢原因是,sizeof不是乙個函式,是乙個操作符,其求i++的型別的size,這是一件可以在程式執行前(編譯時)完全的事情,所以sizeof(i++)直接就被4給取代了,在執行時也就不會有了i++這個表示式#include
intmain()
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...