我编写了以下代码,但它生成了荒谬的输出值。我无法弄清楚代码中的错误。
#include <stdio.h>
int main(void)
{
int t, n, i, count;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
long long a[n], limit;
for(i = 1; i <= n; i++)
scanf("%lld", &a[i]);
count = 1;
limit = a[1];
for(i = 2; i <= n; i++)
{
if(a[i] < limit)
{
count++;
limit = a[i];
}
}
printf("%lld\n", count);
}
return 0;
}
INPUT: -
3
1
10个
3
8 3 6
5
4 5 1 2 3
输出: -
-4621320042389176319
4615368115365085186个
-4621320334446952446
请解释我的代码出现的任何问题。
答案 0 :(得分:4)
至少有两个问题: 首先,在C数组中索引从0开始,而不是1.因此它必须是
for(i = 0; i < n; i++)
scanf("%lld", &a[i]);
count = 1;
limit = a[0];
for(i = 1; i < n; i++)
{
if(a[i] < limit)
{
count++;
limit = a[i];
}
}
其次,您致电printf("%lld\n", count);
,但count
是'普通国家',因此它应该是printf("%d\n", count);
答案 1 :(得分:2)
我无法重现垃圾输出,但是我看到代码中出现了两次UB,这是因为访问a
数组超出界限所致:
for(i = 1; i <= n; i++)
scanf("%lld", &a[i]);
...和...
for(i = 2; i <= n; i++)
{
if(a[i] < limit)
{
count++;
limit = a[i];
}
}
在第一种情况下,您将重复 [1,n
] 范围(其中n
包含在内)。在第二种情况下,您将重复 [2,n
] 范围(其中n
包含在内)。
但您的a
数组包含n
元素,因此其范围为 [0,n),其中n
独占
答案 2 :(得分:1)
鉴于
int count;
此代码
printf("%lld\n", count);
是未定义的行为。
每the C Standard,格式说明符"ll"
适用于long long int
类型:
ll(ell-ell)指定以下
d
,i
,o
,u
,x
或X
转换说明符适用于long long int
或unsigned long long int
参数;或者以下n
转换说明符适用于a 指向long long int
参数的指针。
和
如果转换规范无效,则行为为 未定义。
答案 3 :(得分:0)
您在这里使用了错误的长度修改器:
printf("%lld\n", count);
这样做可以调用未定义的行为,因此可以打印任何内容 - 任何事情都可能发生。
打印int
(count
是)只使用d
而不使用任何长度修饰符。
printf("%d\n", count);
(或将count
定义为long long int
,这是lld
期望的内容。