首页 > 解决方案 > 为什么“比数据参数更多的 '%' 转换”错误消息输出一个大的负整数作为第一个数字?为什么是 0 的后记?

问题描述

所以我正在学习 C。我正在尝试在一个名为https://replit.com/languages/c的基于 Web 的 IDE 上乱搞。

我决定学习编写一个从 1 到 100 的计数器函数(使用 for 循环迭代器)。我使用以下代码成功地做到了这一点:

#include <stdio.h>
int main (void) {
  for (int i = 1; i < 101; i++)
    {
      printf("%i\n", i);
    }

}

这段代码正是我想要的。所以我决定学习更多并破解代码。我删除了打印语句中的数据参数“i”,然后再次运行代码以查看会发生什么。

#include <stdio.h>
int main (void) {
  for (int i = 1; i < 101; i++)
    {
      printf("%i\n");  <-- notice int variable i is removed
    }

}

不出所料,控制台给了我一个警告“警告:比数据参数更多的 '%' 转换”。这对我来说很有意义。没有意义的是输出。代码运行时出现警告,并在控制台中显示以下内容:

-921955384
0
0
0
0
0
...

我假设它在有问题的大负整数之后又打印了 99 个 0,然后终止。我没有计算所有的 0。为什么是负整数?

当我再次运行程序时,它打印:

1818314744
0
0
0
0
0
...

第三次运行打印以下内容:

-725290120
0
0
0
... 

第四:

clang-7 -pthread -lm -o main
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
clang-7: error: linker command failed with exit code 1 (use -v to see invocation)
exit status 1

所以我的问题是:为什么它输出负整数?为什么它从正数变为负数/从正数增加到负数,直到它对于整数类型来说太大了?如果我的“%”没有数据参数,为什么都是 0?为什么会出错?

在给定特定整数类型的情况下,它似乎必须执行存储大小和相应的值范围。我从 CS50 和https://www.tutorialspoint.com/cprogramming/c_data_types.htm的整数类型表中获得了这些信息......所以我将 for 循环中的代码更改为长整数类型:

#include <stdio.h>
int main (void) {
  for (long i = 1; i < 101; i++)
    {
      printf("%i\n");
    }

}

它永远不会出错,所以我认为我正在做某事。但是当我在第 4 次运行时返回到 int 整数类型以重新创建初始错误时,它从我第四次运行时就不再显示该错误消息。它继续前进。事实上,它实际上向我显示了一个不同的初始整数......它以 885981032 开头(与第一次不同的数字是负数),然后给了我 -1940014968,然后是 -42383224,然后是 1313794568,然后是 1348629208,然后是 -303298488 .... 没有错误信息... 全部使用普通的 int 类型并且不长。

这个输出到底是怎么回事?为什么我不能在返回 int 时重新创建错误?第四次运行只是继续显示更多的数字,而不是第一次在第四次运行时吐出错误。什么是负数?它们是如何递增的?为什么是 99 0?

我只是很好奇这里的幕后发生了什么。

标签: cintegercs50

解决方案


推荐阅读