百科问答小站 logo
百科问答小站 font logo



C语言中整型输出(%d)有什么用? 第1页

  

user avatar   pansz 网友的相关建议: 
      

这个问题涉及到早期的C语言设计。也就是在第一个C标准(C89)诞生以前的K&R C。

那时候的 C 语言不需要声明函数原型,函数参数在传入时会被转化,具体转化规则有两个:

第一:所有小于 int 类型的整数都会被转化到 int 型 或者 unsigned int。

第二:所有 float 会被转化为 double。

无论你实际上输入的是 char,还是short,函数调用的时候,这些参数都会被转化为 int 并传入。

同样,无论你输入的 是 float 还是 double,函数调用时实际都以 double 传入。

以上规则作用于两类函数:第一是没有函数原型,或者函数原型内没有参数类型的函数。第二是变参函数中的可变参数。


在现代C语言中,C89以后开始标准建议是不会使用无函数原型的函数,但变参函数依然存在,所以这种自动转化输入参数的调用规则实际上在 printf 这样的函数中被保留了下来。

printf 是一个变参函数,其中的可变参数也符合转化原则,因此实际上所有小于 int 的类型最终都会被转化为 int,小于 double 的浮点都会被转化为 float 。

所以当处理 format 的时候,后面可变参数的传入的值并不是你传入的实际类型。你必须在 format 中指定要显示为何等参数类型,才能正确显示。




  

相关话题

  C++ 有类似C语言container_of这种,通过指针访问对象的方法么? 
  C语言中整型输出(%d)有什么用? 
  为什么学习编程第一课要学习输出"hello, world"?这是谁规定的? 
  把windows平台下mfc框架的代码移植到linux对编程小白来说难度很大吗?应该学习什么内容呢? 
  C++如何返回未知类型的空引用? 
  C 语言中的 double 类型所能表示的数的范围为什么这么大,不是说只占32(或64)位吗? 
  C语言初学者,想问下面这个代码哪里不对,为什么运行不了呢? 
  这个如此诡异的C语言「怪事」是怎么回事? 
  写 C C++ 语言时候,如果每次申请内存就把 Free 内存的代码写上,是否能有效避免内存泄漏? 
  链表求交集,从链表头删去一长串而非一个节点?(已解决)? 

前一个讨论
微软为什么要做 WSL 而不是 LSW?
下一个讨论
12600KF 和 5800X 选哪个?





© 2024-09-19 - tinynew.org. All Rights Reserved.
© 2024-09-19 - tinynew.org. 保留所有权利