gpt4 book ai didi

c - 为什么C的sizeof的返回值类型会随上下文变化?

转载 作者:太空宇宙 更新时间:2023-11-04 05:51:59 24 4
gpt4 key购买 nike

#include <stdio.h>

int main(void)
{
char c;

int charSize = sizeof(c); // Here it is an int

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

编译并运行以上输出:

char: 1
char: 1

如果我使用 %i 而不是 %lu 作为占位符,它会抛出一个编译错误。

这种行为的原因是什么?

编译标志:

clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wshadow sizeof.c -lcs50 -lm -o sizeof

最佳答案

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 是不同的类型。

关于c - 为什么C的sizeof的返回值类型会随上下文变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38287455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com