【问题标题】:Double, Integer, Long double双精度、整数、长双精度
【发布时间】:2018-06-16 18:03:44
【问题描述】:

如果此代码中存在愚蠢的错误,我提前道歉,但我似乎无法解决它。我的问题是,我用 GCC-8 编译(通过 home-brew 安装在 Mac 上),然后在终端中执行。当使用 int 定义变量 s & a 时,我使用下面的打印语句得到零作为输出。如果我将 s & a 变量声明为 double 我仍然会在前两个打印语句中得到零,在最后一个打印语句中得到 1024。我只是不知道发生了什么。感谢任何帮助!

/* square code */
#include <stdio.h>

int main() { 
    int s, a; 
    printf("enter the length of your square \n"); 
    scanf("%f", &s); 
    a= s * s; 
    printf("the area of your square is %f cm using f placeholder \n", a); 
    printf("the area of your square is %lf cm uning fl placeholder\n", a); 
    printf("the area of your square is %d cm using d placeholder \n", a); 
    return(0); 
}

【问题讨论】:

  • int a 无法成功传递给 printf ,其中预计 double,无需强制转换。与scanf 类似,应该是scanf("%d", &amp;s); ,并且没有强制转换可以解决这个问题。
  • 如果你回到你的课本或讲义或教程,那么我敢肯定它会说一些类似于"%f" 格式的内容,scanf 是用于@ 987654331@ 类型。格式和参数类型不匹配导致undefined behavior
  • int s, a; .... scanf("%f", &amp;s); 会在警告完全启用时对许多好的编译器产生警告。节省时间并启用所有警告。

标签: c int double


【解决方案1】:
int s;
scanf("%f", &s);

如果sint,那么您需要像int 一样使用"%d" 而不是"%f" 扫描它。你正在做的是未定义的行为,在scanf()printf() 中都是如此。整数需要扫描并打印为整数。

【讨论】:

    【解决方案2】:

    我认为误解是您将转换说明符 %d%f 视为仅定义输出格式,而不管传递的值类型如何。

    实际上,每个转换说明符都与它将接受的特定类型的参数紧密耦合;例如,%d 仅针对整型定义,而与%d 一起使用的所有其他类型(如浮点或字符串)将产生未定义的行为(例如,参见cpp-reference of printf 以获得更详细的解释)。

    所以double f=1.2;printf("%d",f)不会将浮点值1.2 格式化为整数(有人可能期望1 是输出);它宁可产生未定义的行为,有任何输出(甚至没有输出)、崩溃、……等等。

    当然,这同样适用于scanf-格式说明符。

    所以如果数据类型是int,则使用%d;如果数据类型为double,则使用%f

    【讨论】:

      【解决方案3】:

      在您的代码中,您使用s 作为int,而当您使用scanf 时,您使用的是%f 而不是%d。这就是为什么您将前两个输出设为零的原因。

      至于第三个输出,你会得到预期的值,因为在这种情况下你正确地使用了%d。请看下面的代码:

      int s;
      printf("enter the value");
      scanf("%d", &s);
      printf("the area of square is=", s*s);

      【讨论】:

        【解决方案4】:

        大家好,非常感谢您的帮助。在今天早上检查之前,我又尝试了一件事情,唉,这是一个愚蠢的错误。 在声明“double s,a”时,我意识到我的 scanf() 函数使用的是 scanf("%f",s) 而不是正确的 scanf("%lf", s)"。

        也感谢您在使用“int s,a”时使用 %d 的帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-17
          • 1970-01-01
          • 1970-01-01
          • 2010-10-20
          • 1970-01-01
          相关资源
          最近更新 更多