本來認為對sizeof已經有了比較清晰的認識,沒想到一讀標準,發現自己還是理解錯了。因為我使用sizeof都是用於靜態的sizeof,也就是說sizeof的值在編譯階段就是可以確定的。當時將sizeof理解為乙個巨集了,用於計算型別或者變數所占用的位元組數。讀過c99標準,才發現sizeof既不是乙個巨集,更不是乙個函式,而是乙個operand,乙個運算子啊——當然如果你願意將operand看作乙個函式,尤其是對比c++的運算子過載,我也沒辦法呵。
最重要的是sizeof的值,既可以在編譯期間確定,也可以在執行期間確定。
下面看看標準中對sizeof的一些描述,也是我們平時容易忽略的。
incomplete type, to the parenthesized name of such a type, or to an expression that
designates a bit-field member。
也就是說sizeof不能用於函式,不完整型別,或者位域的型別。
下面看測試程式:
#include
#include
static void func(
)struct test;
struct test_bits
;int main()
編譯:test.c: in function 『main』:
ok,說明對於不完整型別和位域,sizeof都不能通過編譯,那麼去掉對應的**。編譯通過,輸出為:
func size is 1, &func size is 4
這個結果應該出乎意料——以前的我會認為sizeof用於函式,大小應該為4,比較func也可以看做函式的位址,說明sizeof不能用於函式。對於函式指標來說實際上即為指標的大小。
下面看一下sizeof在執行期間的使用:
#include
#include
static void func(
int n)
int main()
輸出結果為:
size is 1
size is 2
size is 3
總結一下我的收穫:
1. sizeof為運算子;
2. sizeof不能用於函式;
3. sizeof既可以在編譯期間確定值,也可以再執行期間確定值。
C99標準之前沒有bool型別(C99提供)
我們知道在c 裡有專門的bool型別,用來表示真或假。但是在c語言裡沒有這樣的型別。表示式的值0為假,非0為真。所以條件判斷語句 if while 非常靈活,甚至乙個指標型別都可以是條件表示式。為了使程式更清晰,我們常常會給出如下的巨集定義 typedef int bool define true ...
C99標準學習筆記 3 操作符 和
今天的筆記沒有乙個很好的標題,也很短。主要是針對 與操作符 a post x expression followed by an expression in square brackets is a subscripted designation of an element of an array ...
C99標準轉義符大全
轉義字元是c語言中表示字元的一種特殊形式。通常使用轉義字元表示ascii碼字符集中不可列印的控制字元和特定功能的字元,如用於表示字元常量的單撇號 用於表示字串常量的雙撇號 和反斜槓 等。轉義字元用反斜槓 後面跟乙個字元或乙個八進位制或十六進製制數表示。轉義字元 意義 ascii碼值 十進位制 a 響...