为什么C&#39的尺寸的返回值类型因环境而异?

时间:2016-07-10 00:16:35

标签: c

char: 1
char: 1

编译并运行上述输出:

%i

如果我使用%lu作为占位符而不是clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wshadow sizeof.c -lcs50 -lm -o sizeof,则会引发编译错误。

这种行为的原因是什么?

编译标志:

console.log(serces); alModel {info: Object} info: Object ProductName:"test product al" StartTime:"00:00:00" StopTime:"00:00:00" __proto__:Object __proto__:Object

1 个答案:

答案 0 :(得分:5)

sizeof运算符始终生成类型为size_t的结果(这是一种实现定义的无符号整数类型)。

但是,size_t可以转换为其他整数类型,如charSize的初始化(即sizeof生成size_t,并转换为int初始化charSize)。

标准描述了这种转换及其限制(例如,如果转换后的结果不能存储在结果类型中,定义明确或不定义)。

声明

printf("char: %lu\n", sizeof(c));    // Here it is an unsigned long

正式具有未定义的行为,因为生成类型sizeof的结果不需要unsigned long,并且如果输出的值不是指定的类型,则printf()表现出未定义的行为格式字符串。确实size_tunsigned long在某些实现(即编译器)上是等价的,然后该语句将表现得恰当。但是,还有其他实现size_tunsigned long是不同的类型。