gpt4 book ai didi

c - 意外行为的大小

转载 作者:太空狗 更新时间:2023-10-29 16:39:27 26 4
gpt4 key购买 nike

考虑以下代码:

  #include <stdio.h>
int main(void)
{
int a[10];
printf("%d",(int)sizeof(a)); //prints 10*sizeof(int) (40 on my compiler)
printf("%d",(int)sizeof(a-3)); //prints sizeof(int) (4 on my compiler)

}

我知道 sizeof() 是一个编译时运算符,但我很惊讶地看到第二个 printf() 的输出。可能是什么原因? sizeof() 的参数是否存在从数组类型到整数类型的隐式转换?

最佳答案

sizeof 运算符不计算它的参数,它只计算 looks at the type它的操作数。

假设您有一个数组a,类型为“T 类型的数组[N]”。那么,在大多数情况下,名称a的类型是“指向T的指针”(T *),指针的值是第一个元素的地址数组 (&a[0])。也就是说,数组的名称“衰减”为指向其第一个元素的指针。在下列情况下不会发生“衰减”:

  • a 与 address-of (&) 运算符一起使用时,
  • a的初始化中(在C中赋值给数组是非法的),以及
  • asizeof 运算符的操作数时。

所以,sizeof a 给你 Nsizeof(T)

当您执行 sizeof(a-3) 时,sizeof 的操作数类型由表达式 a-3 确定。由于 a-3 中的 a 用于 value context (即,以上三个上下文都不是),它的类型是“指向 int 的指针”,名称 a 衰减为指向 a[0] 的指针。因此,计算 a-3 是未定义的行为,但由于 sizeof 不评估其参数,因此 a-3 仅用于确定操作数的类型,所以代码没问题(更多信息请参见上面的第一个链接)。

从上面可以看出,sizeof(a-3)等价于sizeof(int *),在你的电脑上是4。

“转换”是由于减法运算符。您可以看到与逗号运算符类似且可能更令人惊讶的结果:

printf("%zu\n", sizeof(1, a));

还将打印 sizeof(int *),因为逗号运算符导致 a 在值上下文中被使用。

关于c - 意外行为的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2207732/

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