찾다

 >  Q&A  >  본문

c++ - 一段代码,这里为什么用exit(1)而不是return 1?还有如何解读这种避免String = NULL的方式?

学校C语言课的PPT,关于 Command line arguments的,讲的很粗,例题直接看不懂。
直接上图片了,因为有老师的标注,截图比较完整。
我的疑问在于,
1.虚线框内的代码有什么作用,老师说为了避免String = NULL?并不理解。
2.为什么用fprintf并且括号内是stderr?如果没有特殊作用,那我就理解为老师只是为了演示课堂内容了……
3.这里为什么exit()和return混用,各有什么目的?

新入门,求助各位前辈,谢谢!

附上图的原题:

黄舟黄舟2804일 전736

모든 응답(3)나는 대답할 것이다

  • 天蓬老师

    天蓬老师2017-04-17 13:11:50

    原本不打算回答的,但看了楼上vczh的回答,我不太赞同,所以还是发表一下自己的看法吧,如有错误敬请指出。

    1. 因为这段程序需要传入2个参数,后面的2个if语句就是用来读取这2个参数的。而所有程序在运行时第一个参数都是该程序本身的可执行文件的名称,所以为了保证程序传入了2个参数,就需要判断argc的值是否等于3。如果不提前判断,后面的2个if语句中就可能会读取到错误的数据(也就是vczh所说的野指针数据)

    2. 将普通信息和错误信息分别输出到“标准输出”和“错误输出”中,是一种良好的习惯,这样用户就可以方便地区分正常输出和错误输出,例如把两者重定向到不同的日志文件

    3. 对于只有一个线程的程序,在main中使用exitreturn的效果是一样的,都是结束程序。但如果不是在main函数中,或者程序开了多个线程,那么return就无法达到退出程序的目的了。所以退出程序使用exit是一种良好的习惯。第一,它看起来清晰,exit一眼就知道是用来退出的;第二,它可以保证在任何情况下都能正确退出程序,例如我前面所说的开启了多线程或当前不在main函数中的情况。

    最后一点是我和vczh观点最大的不同。我认为,当你的意图是主动、并且是确定地要退出程序时,就用exit,不要用return,其他情况,用return

    我认为你老师的这个程序写的很好,最后一句之所以用return,是因为程序已经执行到最后,main方法是时候“返回”了,这句代码的意图更强调的是main方法正常结束了,而不是我要在这里退出程序,所以这里用的是return(正常返回),而不是exit(强调的是我要让程序退出)——虽然2者在效果上是一样的。

    회신하다
    0
  • ringa_lee

    ringa_lee2017-04-17 13:11:50

    以下答案摘自:
    请问return与exit的区别?谢谢

    return与exit的区别是什么?

    exit()是一个函数
    ,结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程,在父进程中wait系统调用将接受到此返回信息。

    return返回函数值,是关键字

    在main函数中我们通常使用return (0);这样的方式返回一个值。

    但这是限定在非void情况下的也就是void main()这样的形式。

    exit()通常是用在子程序中用来终结程序用的,使用后程序自动结束跳会操作系统。

    但在如果把exit用在main内的时候无论main是否定义成void返回的值都是有效的,并且exit不需要考虑类型,exit(1)等价于return (1)

    exit(0); //正常退出
    非0即是非正常退出
    数字0,1,-1会被写入环境变量ERRORLEVEL,其它程序可以由此判断程序结束状态。
    一般0为正常推出,其它数字为异常,其对应的错误可以自己指定。

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:11:50

    1.虚线框内的代码有什么作用,老师说为了避免String = NULL?并不理解。

    就是检查命令行输入。其实并不是String = NULL,而是你从argv里面会读到野指针。

    2.为什么用fprintf并且括号内是stderr?如果没有特殊作用,那我就理解为老师只是为了演示课堂内容了……

    stderr是用来输出错误信息的。当别的程序启动你的程序,然后读你的输出,而且不显示在屏幕上的时候,有点用。其实这是个早期的跨程序交换数据的方法,早已过时。

    3.这里为什么exit()和return混用,各有什么目的?

    从实践中来看,return也可以。exit是一种粗暴的结束进程的方法,不建议使用。

    회신하다
    0
  • 취소회신하다