main函数相关问题探讨

main函数相关问题探讨

我们接触到C语言很久了,所有人的第一个C程序应该就是HelloWorld.c
而main函数又是所有程序的入口,我记得我在VC下写的第一个HelloWorld是这样

#include <stdio.h>
void main(void)
{
printf("Hello,world\n");
}

现在我们都知道这样的说法void类型不接收也不传递任何信息,main函数可以同时拥有void与int两种类型的定义,但在阅读稍微严谨一点的代码时发现,几乎不会有人去用void类型定义main,所有的main函数定义几乎都为:

#include <stdio.h>
int main()
{
printf("Hello,world\n");
return 0;
}
  • 那么为什么要用int定义,返回值为什么又选择0而不是其他的呢?

其实对于void main(void)这种形式,它就是错误的,虽然在一些编译器中它可以通过编译,但C标准中从未定义过这种形式,在一些编译器中,如果main函数的返回值不是int类型,那么它根本无法通过编译,而有一些编译器则会给予警告,那么一个对于程序很重要的问题就凸显了出来——可移植性,也就是说如果不使用int定义main函数,你的代码几乎不具有可移植性。

返回值的问题先卖一个关子,其实虽然目前写的main函数是这样,但是C语言标准main函数的完整形式应该是:

#include <stdio.h>
int main(int argc,char *argv[])
{
return 0;
}
  • 多这两个参数的意义是什么呢?

因为C语言程序在linux里面运行时是可以和操作系统进行交互的,linux一开始叫做UNIX like,而UNIX就是C语言的作者发明的,那么C语言可以和UNIX类型的操作系统完美兼容,而这两个参数的目的就是程序运行时和操作系统进行交互。

返回值

知道了这两个参数的作用后我们应该能猜到,返回值为0也一定是为了程序与系统进行交互。

为了验证猜想,来做一个实验,在平时使用GCC编译链接时,我们一般会输入

gcc filename.c -o filename;\\编译生成可执行文件
./filename;                \\运行可执行文件

而linux命令行中可以采用&&来进行有条件的多命令输入,即前一命令成功执行成立则执行后一命令。用这种方式来运行一下HelloWorld.c即:

gcc main1.c -o main1 && ./main1  
Hello,world     

可以看到成功执行了后面的语句,这时候需要用到echo 命令,这个命令在shell编程中极为常用,含义是在终端下打印变量的值。

echo $?        \\?表示最后运行的命令的结束代码(返回值),用它来判断程序是否执行成功
0 ;

这时候可以看到成功运行main1后返回值为0,那么在这个基础上再加一步操作。

./main1 && ls    
Hello,world      
main1  main1.c

打印出了Helloworld同时执行了ls命令。

我们将main1的代码改一下,把它的返回值随便取一个,假设取101,这时候的文件命名为main2.c。

#include <stdio.h>
int main()
{
printf("Hello,world\n");
return 101;
}

再次执行

gcc main2.c -o main1 && ./main2  
Hello,world
echo $?
101

可以看到这个返回值就是我们给的返回值101,那么依旧加上ls命令。

./main2  && ls
Hello,world

发现并没有执行ls命令。

至此得出结论,main函数中的返回值为0并不是乱写的,它是有实际意义的,这实际上是一种程序与操作系统交互的过程。

参数

说完了返回值,来看看参数,首先我肯定想弄清这个参数是多少,那么我们把它打印出来,这里我们就不Helloworld了,直接打印参数,文件命名为main3.c。

#include <stdio.h>
 
  int main(int argc,char *argv[])
  {
        printf("argv is %d\n",argv);
        return 0;
  }

接着编译运行

gcc main3.c -o main3   &&  ./main3
argc is 1

发现它是1,那么为什么是1呢,能不能是别的数?我们知道linux命令在执行的时候是可以加参数的,例如ls命令,可以ls -l,ls -a等等,或者都写在一起 ls -a -l。那么在这里运行main3时我们也给它加上参数,尽管可能没什么实际意义。

./main3 -a
argc is 2
./main3 -a -l
argcis 3

发现了很神奇的事情,每多加一个参数,它的argc就加1。这很明显了,argc就是在程序运行过程中所含参的数量,有两个参数,int类型用来记录含参数量,还有一个指针类型的数组argv[],那是不是可以大胆预言,它的作用就是保存参数的具体值呢?预言没有用,打印一下不就知道了吗。把新的代码命名为main4.c。

#include <stdio.h>
  
 int main(int argc,char *argv[])
 {
   printf("argc is %d\n",argc);
          int i;
          for(i=0;i<argc;i++)
         {
                  printf("argc%d is %s\n",argc,argv[i]);
         }
          return 0;
  }

编译链接后

gcc main4.c -o main4  &&  ./main4
argc is 1
argc1 is ./main4

果然是这样,来试试多参数的情况,参数随便加下

./main4 -a -l -sdada -dsadadfas
argc is 5
argc5 is ./main
argc5 is -a
argc5 is -l
argc5 is -sdada
argc5 is -dsadadfas

我想我们可以得出结论了,这两个参数的作用,argc用来表示main函数执行过程中的参数数量,而argv 是一个指针数组,他的元素个数是argc,存放的是指向每一个参数的指针。

猜你喜欢

转载自blog.csdn.net/weixin_43122409/article/details/83511419