#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 系列,都是奇怪的特例。它们因不存在类型安全而臭名昭著,因此如果您传递了错误的类型或使用了错误的格式字符串,您将调用未定义的行为,任何事情都可能发生。
在您的情况下,很可能 int
和 long
恰好具有相同的表示形式,因此尽管有警告,程序仍能运行。
但是在常规函数的情况下,如果您将较大的整数类型传递给期望较小整数类型的函数,则会发生一种“降级”。发生这种情况时,您会触发从较大类型到较小类型的转换,这是明确定义的。 (但是,如果您混合使用不同符号的类型,结果将是特定于编译器的。)
编译器往往会针对此类隐式转换发出警告,因此最好使用强制转换显式进行转换。
关于在像 printf() 这样的可变参数函数中,整数提升能否以相反的顺序发生(例如 long int 到 int)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44969063/