探寻main函数的标准写法,以及获取main函数的参数、返回值

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

main函数表示法

        很多同学在初学C或者C++时,都见过各种各样的main函数表示法:

  • main(){/*...*/}
  • void main(){/*...*/}
  • int main(){/*...*/}
  • int main(void){/*...*/}
  • int main(int argc, char *argv[]){/*...*/}
  • int main(int argc, char **argv){/*...*/}
  • ......

        看过这么多写法之后,不禁顿生疑惑,到底哪个才是main函数的标准写法?


main函数的标准写法

        先看C语言标准文档里对main函数的描述:


        再看C++标准文档里对main函数的描述:


        至此,哪些是标准写法便一目了然。

        那么写成main()或者void main()到底行不行?答案是不一定行。在旧的编译器上,这样写也能通过,但主要是为了兼容C/C++标准未出来之前的历史代码。在较新的编译器上,这样写都会得到一个警告信息,或者,干脆就是错误信息,无法通过编译。

        所以,为了代码的规范性,通用性,请坚持按标准文档里推荐的写法来写。尤其是初学者,按标准来写是一种很好的习惯,而编程重的好习惯甚至比编程本身还重要!

        那么也有人疑惑main函数第二个参数到底是char *argv[]还是char **argv?答案是都行,argv首先是一个数组,其数组元素的类型是字符指针,每一个字符指针都指向一个特定的字符串,如下图:


        此外,也许还有人对main函数的参数名称有疑问,既然main函数也是个函数,那么它的参数名称argc、argv可以替换成其它合法的标识符吗?这个答案也是肯定的,如果心血来潮,写成int main(int a, char *b[])这种形式也是被允许的,但是仍然建议按argc、argv写,避免不必要的疑惑。


main函数为什么要有返回值和参数值

        简单地说,为了与系统环境通信。

        main函数是系统执行程序的入口,可以将main函数看做是供系统调用的。既然系统可以调用main函数,那么系统就有为main函数传递指令(参数)的需求,同时,main函数也有为系统环境返回信号的义务。这样一来,参数充当入口,return充当出口,使得main函数的功能更加完善。


获取main函数的参数值

        既然main函数可以有参数,那么就一定可以获取它的参数值,只要为它传入指定的实参,就可以在main函数中把它打印出来。

        先写一段打印参数的代码,命名为text.c,编译,默认结果显示argv[0]存储函数名称及其路径,而argv[argc]为空指针:


        打开cmd命令窗口,切换至程序所在目录,为本程序传入参数:


        显然,打印出的参数内容与我们的预期一致。


获取main函数的返回值

        同理,main函数既然为系统返回了信号,那么系统也一定可以获取到它。重写编写源文件,这次我们把无关部分全部略去,只剩返回值。

        先编译,然后打开cmd窗口切换至当前程序目录下,输入text.exe,回车后,再输入echo %errorlevel%,然后就可以看到打印出的返回值了:


        除了这种方法,也可以用main函数调用main函数本身来打印它的返回值,但是这样做就相当于让main函数进入了递归调用当中,必须设定恰当的终止条件,否则程序将陷入无限递归,进而崩溃。



小结

        由此可以看出,main函数除了可以与系统通信外,与普通函数还是很一致的,说到底,它也只是个函数么。

        编程中,一些语法是标准所强制要求的,另一些语法标准里并未强制要求,而是建议,或者连建议都没,只是由编译器的实现而定。这时候,就要尽量按标准里强制的或者建议的语法去书写程序,这样做可以极大地保证程序的健壮性。


▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
函数法和PSO算法都是优化算法中常用的方法,结合使用可以提高优化效果。罚函数法是在优化问题中加入罚项,强制约束条件得到满足,而PSO算法则是借鉴鸟群觅食的行为方式,在解空间内粒子不断探寻最优解。下面给出在Matlab中结合使用罚函数法和PSO算法的示例代码。 function [x,fval,exitflag]=pso_penalty(fun,lb,ub,A,b) % fun: 待优化的目标函数 % lb: 各参数的下界 % ub: 各参数的上界 % A: 线性不等式约束条件中的系数矩阵 % b: 线性不等式约束条件中的常量项 n = length(lb); % 确定待优化问题的维度 options = optimoptions(@fmincon,'Algorithm','interior-point'); % 选择使用内点法的fmincon函数进行优化 options.Display = 'off'; % 关闭显示内容 fun_penalty = @(x) fun(x) + sum(max(0,A*x-b))^2; % 加入罚项 problem = createOptimProblem('fmincon','objective',fun_penalty,'x0',rand(n,1),... 'lb',lb,'ub',ub,'Aineq',A,'bineq',b,'options',options); % 创建优化问题 ms = MultiStart('Display','off'); % ms对象是一个多次运行算法的类,可处理非线性多目标问题和带局部极小值的单目标问题 [x,fval,exitflag]= run(ms,problem,20); % 与PSO算法结合,运行20次multi-start算法 end 在使用时,需要输入目标函数fun、各参数的下界lb和上界ub以及线性不等式约束条件A、b。函数中首先将目标函数加入罚项得到新的优化目标函数。然后使用内点法的fmincon函数进行优化,A、b则是作为参数输入。最后,利用Matlab中的MultiStart函数与PSO算法结合,多次运行PSO算法以得到更好的优化结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值