[英]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
为什么仅通过替换相同的n
和a[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.
“为什么仅仅通过替换相同的
n
和a[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.