`int main(i){printf(“ i =%d \ n”,i);我的值为1。为什么?请解释?

时间:2019-10-18 20:03:36

标签: c initialization implicit

为什么打印我的值为1,有人可以解释一下吗?

#include<stdio.h>
int main(i)
{ 
    printf("i = %d\n", i); 
}

输出i = 1。

2 个答案:

答案 0 :(得分:6)

Ci解释为类型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的常规argcargv参数的实际含义。 C的main定义基于命令行调用。通常人们会输入类似

programname somefilename someotherargument

,然后点击RETURN。这将调用一个名为programname的程序,该程序带有两个命令行参数somefilenamesomeotherargument。那么这些如何传递到main

好吧,argc是其中有多少个计数,而argv是参数字符串本身的数组(v代表“向量”)。并且参数列表始终包含程序名称本身。因此,如果您调用

programname somefilename someotherargument

然后argc以3的形式出现,而argv以数组的形式出现

{ "programname", "somefilename", "someotherargument", NULL }

但是,如果您调用不带任何参数的内容,那么argc仍会以1的形式出现。因此,这就是您看到的1的来源。