在像 printf() 这样的可变参数函数中,整数提升能否以相反的顺序发生(例如 long int 到 int)?

标签 c

#include<stdio.h>
int main() {
    long a = 9;
    printf("a = %d",a);//output is 9 but with a warning 'expecting long int'
}

为什么这里long不能转int?

最佳答案

一般的可变参数函数,特别是 printf 系列,都是奇怪的特例。它们因不存在类型安全而臭名昭著,因此如果您传递了错误的类型或使用了错误的格式字符串,您将调用未定义的行为,任何事情都可能发生。

在您的情况下,很可能 intlong 恰好具有相同的表示形式,因此尽管有警告,程序仍能运行。

但是在常规函数的情况下,如果您将较大的整数类型传递给期望较小整数类型的函数,则会发生一种“降级”。发生这种情况时,您会触发从较大类型到较小类型的转换,这是明确定义的。 (但是,如果您混合使用不同符号的类型,结果将是特定于编译器的。)

编译器往往会针对此类隐式转换发出警告,因此最好使用强制转换显式进行转换。

关于在像 printf() 这样的可变参数函数中,整数提升能否以相反的顺序发生(例如 long int 到 int)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44969063/

相关文章:

c - Bare-Metal C : Why are some IDEs startup files doing things crt0. s 无论如何都会处理?

c - 当 proc 目录中没有 cmdline 文件时,如何在 Unix 上检查进程是否正在按名称运行?

c - C : Merge Sort implementation - memory allocation 错误

c++ - 如何在 C++ 中挂起和恢复进程和线程

c - 如何将 readline 历史记录保存在文本文件中并在之后调用它

c - 嗨,有人可以帮我解决这个循环吗

c - C 中不同类型的外部变量的声明

C# - Marshall 并将 void 指针传递给从 C# 调用的 C 函数

c - 为什么这不能正确评估? (欧拉计划 9 - C)

c - 是否可以将 ruby​​ ffi 附带的功能设为私有(private)?