C 产生荒谬的输出
我编写了以下代码,但它生成了荒谬的输出值。我想不出代码中出了什么问题C 产生荒谬的输出,c,io,printf,output,C,Io,Printf,Output,我编写了以下代码,但它生成了荒谬的输出值。我想不出代码中出了什么问题 #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++)
#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;
}
输入:-
三,
1.
10
3.
8 3 6
5.
4 5 1 2 3
输出:-
-4621320042389176319
4615368115365085186
-462132033446952446
请解释我的代码有什么问题。您在这里使用了错误的长度修饰符:
printf("%lld\n", count);
这样做会调用未定义的行为,因此可以打印任何内容—任何事情都可能发生
要打印计数为d的整数,不使用任何长度修饰符
printf("%d\n", count);
或者将count定义为long-long int,这是lld所期望的。至少有两个问题: 首先,在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是一个“普通int”,所以它应该是printf%d\n,count 我无法复制垃圾输出,但我在代码中看到了两次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个是独占的。
int count;
此代码
printf("%lld\n", count);
是未定义的行为
根据,格式说明符ll用于long int类型:
ll指定以下的d、i、o、u、x或x
转换说明符应用于长整型或无符号长整型参数;或以下n个转换说明符应用于
指向长整型参数的指针
及
如果转换规范无效,则行为无效
未定义
您的范围以及两个for循环在循环内的索引都是错误的。您正在访问数组a的边界之外。数组索引范围是0…N-1。