簡體   English   中英

為什么 char 文字的 sizeof 與 sizeof(char) 不同?

[英]Why is sizeof a char literal not the same as sizeof(char)?

該程序

#include <stdio.h>
int main(void) {
    printf("sizeof( char ) = %zu, sizeof 'a' = %zu.\n", sizeof( char ), sizeof 'a' );
    return 0;
}

輸出以下內容:

sizeof( char ) = 1, sizeof 'a' = 4.

我正在用 gcc 編譯(clang 給出相同的結果)和這些標志:

gcc -Wall -Wextra -Wswitch -pedantic -ansi -std=c11 -DDEBUG -ggdb3 -o

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf規范的第 6.5.3.4 節第 4 段說

4 當 sizeof 應用於類型為 char、unsigned char 或 signed char(或其限定版本)的操作數時,結果為 1。

所以我希望操作數 'a' 的 sizeof 為 1,因為 'a' 的類型是 char,還是自動“提升”為 int 或類似的東西? (我注意到,如果我將 'a' 轉換為 char,則 sizeof( (char)'a' ) 為 1)。

還是我看錯了標准?

在 C 中,與 C++ 整數字符常量(文字)相反,其類型為int

所以表達式sizeof( 'a' )的值等於表達式sizeof( int ) sizeof( char )始終等於1

來自 C 標准(6.5.3.4 sizeof 和 alignof 運算符)

4 當 sizeof 應用於具有 char、unsigned char 或 signed char 類型(或其限定版本)的操作數時,結果為 1...

和(6.4.4.4 字符常量)

10整數字符常量的類型為 int。 包含映射到單字節執行字符的單個字符的整數字符常量的值是解釋為整數的映射字符表示的數值。 包含多個字符(例如,'ab')或包含未映射到單字節執行字符的字符或轉義序列的整數字符常量的值是實現定義的。 如果整數字符常量包含單個字符或轉義序列,則其值是將具有 char 類型的對象(其值為單個字符或轉義序列的值)轉換為 int 類型時產生的值。

請注意,由於整數提升,通常在操作中用作操作數或表達式的char類型的對象會轉換為int類型。

字符常量(或更准確地說,整數字符常量)具有int類型。

C 標准的第 6.4.4.4p2 節描述了字符常量:

整數字符常量是用單引號括起來的一個或多個多字節字符的序列,如'x' 寬字符常量是相同的,只是以字母LuU為前綴。 除了稍后詳述的少數例外,序列的元素是源字符集的任何成員; 它們以實現定義的方式映射到執行字符集的成員

第 10 段首先描述了包含類型描述的語義:

整數字符常量的類型為int 包含映射到單字節執行字符的單個字符的整數字符常量的值是解釋為整數的映射字符表示的數值。 包含多個字符(例如,'ab')或包含未映射到單字節執行字符的字符或轉義序列的整數字符常量的值是實現定義的。 如果整數字符常量包含單個字符或轉義序列,則其值是將具有char類型且值為單個字符或轉義序列的對象轉換為int類型時產生的值

在 C 語言中, character literal量不是char類型。 C 將字符文字視為integer 因此, sizeof('a')sizeof(1)之間沒有區別。

字符文字的大小等於整數的大小

'a'具有整數類型, sizeof('a')給出int的大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM