C99標準學習筆記 4 sizeof運算子

2021-07-04 10:25:34 字數 1171 閱讀 9204

本來認為對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 響...