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
答案 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_t
和unsigned long
在某些实现(即编译器)上是等价的,然后该语句将表现得恰当。但是,还有其他实现size_t
和unsigned long
是不同的类型。