为什么打印我的值为1,有人可以解释一下吗?
#include<stdio.h>
int main(i)
{
printf("i = %d\n", i);
}
输出i = 1。
答案 0 :(得分:6)
C
将i
解释为类型int
-if you don't declare a variable, its default type is int
。碰巧的是,main
通常被称为int main(int argc, char **argv)
,因此您的i
(现在是int
)适合该第一个参数。 main
仅允许您使用一个参数but this is technically undefined behavior来调用它-不要这样做。
第一个值argc
是一个数字,详细说明了给出了多少个命令行参数。 (第二个是这些参数的字符串。)在您的情况下,仅给出了一个命令行参数,即可执行文件的名称(可能是./a.out
)。
尝试使用./a.out some strings here
运行代码-您会注意到打印出不同的值。
答案 1 :(得分:1)
这里有两个或三个不同的小谜团。不知道您想知道哪一个,所以我想我会回答所有这三个。
您如何摆脱int main(i)
的类型而i
的声明?
您如何宣布main
接受一个参数,而不是常规的两个参数?
值1从何而来?
答案:
(1)很久很久以前,就算是C的黎明(或至少是早晨),函数定义语法也有所不同。你没说过类似的话
int main(int argc, char *argv[])
{
...
}
相反,你说
int main(argc, argv)
int argc;
char *argv[];
{
...
}
那时,“隐式int
”也风行一时。所以,如果你只是写
int main(argc, argv)
char *argv[];
{
...
}
编译器说:“好吧,有一个参数argv
和一个char **
,有一个参数argc
和一个...哦,您没有说,所以我只是默默假设int
。”
由于C向后兼容一直很重要,因此即使现在已经有一段时间正式淘汰,许多编译器仍在接受较旧的语法。
(2)另外,根据您的情况,您完全省去了argv
部分。 main
应该有两个参数,这是程序启动时系统调用它的方式,但是您只声明了它接受一个。那为什么行得通呢?
严格来说,当调用函数的参数数量与预期的数量不同时,行为是不确定的,但这是您经常可以避免的事情,尤其是在传递的参数比预期的多的情况下。因此,尽管系统传递了程序不期望的第二个argv
参数,但是多余的参数只是被悄悄地丢弃了。
(3)然后,1的来源是什么?好吧,这是由于main
的常规argc
和argv
参数的实际含义。 C的main
定义基于命令行调用。通常人们会输入类似
programname somefilename someotherargument
,然后点击RETURN。这将调用一个名为programname
的程序,该程序带有两个命令行参数somefilename
和someotherargument
。那么这些如何传递到main
?
好吧,argc
是其中有多少个计数,而argv
是参数字符串本身的数组(v代表“向量”)。并且参数列表始终包含程序名称本身。因此,如果您调用
programname somefilename someotherargument
然后argc
以3的形式出现,而argv
以数组的形式出现
{ "programname", "somefilename", "someotherargument", NULL }
但是,如果您调用不带任何参数的内容,那么argc
仍会以1的形式出现。因此,这就是您看到的1的来源。