为什么返回值类型为C';s的大小随上下文而变化?

为什么返回值类型为C';s的大小随上下文而变化?,c,C,如果我使用%I作为占位符而不是%lu,则会引发编译错误 这种行为的原因是什么 编译标志: clang-ggdb3-O0-std=c11-Wall-Werror-Wshadow sizeof.c-lcs50-lm-o sizeof运算符总是生成类型为size\t的结果(这是实现定义的无符号整数类型) 但是,可以将size\u t转换为其他整数类型,就像初始化charSize时发生的那样(即sizeof生成size\u t,并将其转换为int以初始化charSize) 该标准描述了此类转换及其限制(

如果我使用
%I
作为占位符而不是
%lu
,则会引发编译错误

这种行为的原因是什么

编译标志:


clang-ggdb3-O0-std=c11-Wall-Werror-Wshadow sizeof.c-lcs50-lm-o sizeof
运算符总是生成类型为
size\t
的结果(这是实现定义的无符号整数类型)

但是,可以将
size\u t
转换为其他整数类型,就像初始化
charSize
时发生的那样(即
sizeof
生成
size\u t
,并将其转换为
int
以初始化
charSize

该标准描述了此类转换及其限制(例如,如果转换的结果无法存储在结果类型中,则定义是否明确)

声明

char: 1
char: 1

形式上具有未定义的行为,因为不需要
sizeof
生成类型为
unsigned long
的结果,并且如果输出的值不是格式字符串中指定的类型,则
printf()
显示未定义的行为。诚然,
size\u t
unsigned long
在某些实现(即编译器)上是等效的,并且该语句将适当地执行。但是,对于其他实现,
size\u t
unsigned long
是不同的类型。

sizeof运算符总是生成类型为
size\u t
的结果(这是实现定义的无符号整数类型)

但是,可以将
size\u t
转换为其他整数类型,就像初始化
charSize
时发生的那样(即
sizeof
生成
size\u t
,并将其转换为
int
以初始化
charSize

该标准描述了此类转换及其限制(例如,如果转换的结果无法存储在结果类型中,则定义是否明确)

声明

char: 1
char: 1

形式上具有未定义的行为,因为不需要
sizeof
生成类型为
unsigned long
的结果,并且如果输出的值不是格式字符串中指定的类型,则
printf()
显示未定义的行为。诚然,
size\u t
unsigned long
在某些实现(即编译器)上是等效的,并且该语句将适当地执行。但是,对于其他实现,
size\u t
unsigned long
是不同的类型。

不,它不是。除非编译器不符合标准,否则它总是
size\u t
。使用不正确的格式说明符会调用未定义的行为,在一种情况下它碰巧发出编译错误,不幸的是,在另一种情况下它碰巧没有发出编译错误。
size\u t
的正确格式说明符是
%zu
。如果没有
%zu
格式说明符,则必须将
sizeof
的结果强制转换为
printf
。许多编译器的格式规范与
printf
的参数不匹配-他们只是相信你所说的。@MikeCAT除了MSVC,它是
%Iu
。万岁,微软!不,没有。除非编译器不符合标准,否则它总是
size\u t
。使用不正确的格式说明符会调用未定义的行为,在一种情况下它碰巧发出编译错误,不幸的是,在另一种情况下它碰巧没有发出编译错误。
size\u t
的正确格式说明符是
%zu
。如果没有
%zu
格式说明符,则必须将
sizeof
的结果强制转换为
printf
。许多编译器的格式规范与
printf
的参数不匹配-他们只是相信你所说的。@MikeCAT除了MSVC,它是
%Iu
。万岁,微软!
printf("char: %lu\n", sizeof(c));    // Here it is an unsigned long