c - 为什么“比数据参数更多的 '%' 转换”错误消息输出一个大的负整数作为第一个数字?为什么是 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?
我只是很好奇这里的幕后发生了什么。
解决方案
推荐阅读
- wordpress - 在 FTP 中下载哪个文件夹以下载整个 WordPress 站点
- php - Symfony 用户角色和访问站点的安全部分
- python - 尝试将图像置于画布中心时出现错误
- .net-core - 使用 microsoft graph 创建团队时出现 Odata.bind 错误
- python - 为什么我的代码只抓取前 3 张图片,而不是全部?
- html - 如何仅禁用一个组件的主体样式
- lua - lua过滤器插入自定义参考书目
- macos - 在 Mac OSX 中的 Puppeteer 中设置语言不起作用
- angular - 使用 Service Store (BehaviorSubject) 在组件之间进行通信时模板未更新
- python - 尽管指定了allow_redirects = False,但使用Python 3 Requests库发布,仍在重定向