c - 为什么 sizeof 对 %f 的响应不同?

标签 c gcc escaping sizeof

为什么我得到的值与使用 %d 而不是 %f 的值不同?

void main()
{ 
   int arr;
   printf("%f",sizeof(arr));
}

输出:2.168831

void main()
{ 
   int arr;
   printf("%d",sizeof(arr));
}

输出:4

最佳答案

再多解释一下,这是因为 printf() 是一个可变参数函数,参数的类型直到函数运行并根据格式确定它们是什么时才知道字符串。这意味着不会发生正常的隐式转换。

例如,如果您执行以下操作:

void myfunc(double d) {
    /*  Do something with d  */
}

int main(void) {
    int n = 5;
    myfunc(n);
    return 0;
}

然后编译器知道 myfunc() 采用 double 类型的参数,因此可以并将 n 隐式转换>intdouble 在传递参数之前。

当你这样做时:

int main(void) {
    double f = 5.5;
    printf("%d\n", f);  /*  WARNING: buggy code  */
    return 0;
}

编译器在运行并理解格式字符串中的 %d 之前,不知道 printf() 期望什么类型。所以,它所能做的就是将 double 参数作为 double 传递,当 printf() 运行并看到 %d ,它将把它解释为一个 int,当它错误解释位模式时,事情就会开始变得非常错误(在这种情况下,可能还有参数的大小,对于后面的任何其他参数,将其丢弃)。

除其他外,这就是为什么这些函数是 C 中实际上需要强制转换为 void * 的罕见情况之一的原因,因为允许指向不同类型对象的指针不同的大小,并且由于 %p 需要一个 void *,您必须向它传递一个 void *,而不是指向任何其他对象的指针类型。

但请注意,现代编译器可以很聪明,它们知道标准 C 函数的工作原理,因此它们可以仅了解函数的标准行为,例如 printf(),这样它们就可以像这样向您发出有关不匹配参数类型的警告,尽管它们实际上不会为您修复它们。

关于c - 为什么 sizeof 对 %f 的响应不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19335819/

相关文章:

带有位图字体的 C 头文件

c - 在 ubuntu 11.04 上使用 gcc 4.5.2 声明函数指针时出错

c++ - 如何在 C/C++ 中(取消)转义字符串?

javascript - 为什么 "\001"=== "\u0001"在 javascript 中是真的?

C 具有可变大小行的二维数组

c - 使用 munmap 时回收更高的页面

c - Linux 生成文件示例

linux - 如何让 GCC 检测标准 C 库?

命令 clear 不会接受终止信号(在无限循环中 | c 程序)

ansible - 如何使用 Ansible 或 Jinja2 转义变量名中的冒号 (":")?