繁体   English   中英

C 中的歧义使用 Printf

[英]Ambuiguity in C using Printf

为什么C语言会这样

#include <stdio.h> 
#include <stdlib.h> 
int main()
{
 const int size = 3;
 double a[size];
 for(int n=0; n<size; ++n){
   a[n] = n;
   printf("%d,%d\n",n,n+1);
 }
}

Output 是

0,1 
1,2 
2,3

但是当我这样做时

#include <stdio.h> 
#include <stdlib.h> 
int main()
{
 const int size = 3;
 double a[size];
 for(int n=0; n<size; ++n){
   a[n] = n;
   printf("%d,%d\n",a[n],n+1); //change is here
 }
}

Output 是:

1,1
2,2
3,3

为什么仅通过替换相同的na[n]来更改值?

a[n]是双精度数,不能使用 %d printf

原因是由于第二个事实是您尝试使用%d格式规范打印a[n]这是一个double类型,它用于int ,导致未定义的行为。

例如,在我的系统中,我打印了这个:

1,1559556488
2,1559554816
3,1559554816

编译应该警告你这一点。 C-lang 给你一个:

clang-7 -pthread -lm -o main main.c
main.c:9:21: warning: format specifies type 'int' but the argument has type
      'double' [-Wformat]
   printf("%d,%d\n",a[n],n+1); //change is here
           ~~       ^~~~
           %f
1 warning generated.

为什么仅仅通过替换相同的na[n]来改变值

当您使用printf("%d,%d\n", a[n], n+1); 在第二个示例中,第二个参数 ( a[n] ) 的类型为double ,而在第一个示例中, n的类型为int

您使用int类型的n作为索引不会使int类型的寻址double object 。


使用%d转换说明符打印double精度值会调用未定义的行为

C 标准规定:

d,i int参数转换为样式[-]dddd 中的有符号十进制。 精度指定出现的最小位数; 如果要转换的值可以用更少的数字表示,则用前导零扩展它。 默认精度为 1。精度为零的零值转换的结果是没有字符。

来源:C18,7.21.6.1/8

如果转换规范无效,则行为未定义。288)如果任何参数不是相应转换规范的正确类型,则行为未定义

资料来源:C18,7.21.6.1/9

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM