【问题标题】:C printf int and double same resault diffrent assumes [duplicate]C printf int和double相同的结果不同的假设[重复]
【发布时间】:2019-09-25 13:50:48
【问题描述】:

我正在尝试了解它是如何工作的。

#include<stdio.h> 
int main() 
{ 
    int a = 110; 
    double d = 10.21; 
    printf("sum  d: %d  \t\t size  d: %d \n", a+d, sizeof(a+d)); 
    printf("sum lf: %lf \t size lf: %lf \n", a+d, sizeof(a+d)); 
    printf("sum lf: %lf\t size  d: %d \n", a+d, sizeof(a+d)); 
    printf("sum  d: %d \t\t size lf: %lf \n", a+d, sizeof(a+d)); 
    return 0; 
}  

输出是:

sum  d: 8        size  d: 1343288280 
sum lf: 120.210000   size lf: 0.000000 
sum lf: 120.210000   size  d: 8 
sum  d: 8        size lf: 120.210000

【问题讨论】:

  • 你期待什么输出?
  • sizeof 需要 %zu 格式说明符。
  • 如果将错误类型的参数传递给 printf,那么后面的 args 可能无法正确对齐。
  • 解释您期望的输出以及原因。
  • 您通过将参数传递给printf() 来产生未定义的行为,这些参数与其相应的格式指令不匹配。这里没有什么要理解的,除了 C 不保证程序会做什么。

标签: c printf


【解决方案1】:

printf 为您提供的每个格式说明符从堆栈中读取一定数量的字节。格式说明符必须与实际参数匹配,否则最终可能会导致部分读取参数或读取超出参数边界。

在您的第一条语句中,第一个参数是double,因此%f 是正确的格式说明符。使用%d 可能会导致printf 尝试读取比为该参数提供的更多字节,从而导致未定义的行为。第二个参数是size_t 类型,它需要%zu 或该类型的另一个有效说明符。

【讨论】:

  • 如果说明符不正确,无论类型大小如何,都是未定义的行为
  • 第一个匹配a + d的格式说明符必须是%f
  • @WeatherVane 可以是%lf%f(两者定义相同)
  • @M.M 是的,但答案中不是%d
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多