【问题标题】:Implicit conversion in C?C中的隐式转换?
【发布时间】:2010-11-16 20:53:16
【问题描述】:

这里发生了什么:

printf("result = %d\n", 1);
printf("result = %f\n", 1);

输出:

result = 1
result = 0.000000

如果我在尝试打印这些变量之前确保它们的类型,它当然可以正常工作。为什么第二个打印语句没有被隐式转换为 1.00000?

【问题讨论】:

    标签: c implicit-conversion


    【解决方案1】:

    在第二种情况下,格式字符串和参数类型不匹配 - 因此结果是未定义的行为(u)r。

    【讨论】:

    • +1 表示“行为”中的额外字母。我们英国人用它作为备份,以防“o”发生任何令人讨厌的事情。
    • @Moo-Juice:也让这个词有完整的元音集。
    • @caf: 为什么我找不到 y? =)
    • @Arkku:仅供参考,而且完全偏离主题,“滑稽地”这个词包含按字母顺序排列的所有元音(包括 y!) - 英语中至少还有一个其他词具有相同的属性。
    【解决方案2】:

    1 未转换为 1.0 的原因是 printf“只是”一个具有可变数量参数的 C 函数,并且只有第一个(必需的)参数具有指定的类型 (const char *)。因此,编译器“不能”知道它应该转换“额外”参数——它被传递之前printf实际上读取格式字符串并确定它应该得到一个浮点数。 p>

    现在,诚然,您的格式字符串是一个编译时常量,因此编译器可以从printf 中生成一个特殊情况,并警告你关于不正确的参数(并且,正如其他人所提到的,一些编译器会这样做,至少如果你要求他们这样做)。但在一般情况下,它无法知道任意 vararg 函数使用的具体格式,也可以以复杂的方式(例如在运行时)构造格式字符串。

    总而言之,如果您希望将特定类型作为“变量”参数传递,需要对其进行强制转换。

    【讨论】:

    • 请注意,对于可变参数,charshort 被提升为 intfloat 被提升为 double
    【解决方案3】:

    未定义的行为。一个 int 被视为浮点数

    【讨论】:

    • ITYM "一个 int 被视为一个浮点数"。
    • printf 实际上正在寻找double
    【解决方案4】:

    简短的回答是 printf 并不是真正的 C++。 Printf 是一个 C 函数,它接受一个变量参数列表,并根据格式字符串中指定的类型将提供的参数应用于格式字符串。

    如果您想要任何类型的实际类型检查,您应该使用流和字符串 - 实际 C++ 替代良好的旧 C 样式 printf。

    【讨论】:

      【解决方案5】:

      有趣,如果你的 put '1.0' 大概没问题

      我想 printf 只获取变量的地址,它无法知道它是什么。但我原以为编译器会礼貌地警告你。

      【讨论】:

      • 编译器不知道函数期望什么类型。这就是使可变参数函数非常容易出错的原因
      • @Alexander:注意一些编译器,例如gcc, do 检查 printf et al 的格式字符串,并且可以针对参数的数量和/或类型不匹配发出警告。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多