这是我从课堂上获得的一项功能。我只是对这里的流量控制感到困惑。第一个if
语句检查是否存在函数和至少一个参数。据我所知,第二个else if
流量控制是检查argv[1]
是否不是NULL
指针。我的问题是,如果第一个流量控制通过,那是否意味着第二个流量控制肯定会通过?在这种情况下,我们如何达到第三流量控制?我对第二个流量控制的理解不正确吗?
int my_function(int argc,char **argv)
{
if (argc < 2) {
fprintf(stderr,"not enough arguments" );
return(1);
}
else if (argv[1])
return(atoi(argv[1]));
else
exit(0);
}
〜
答案 0 :(得分:4)
您的理解是正确的 - else if
声明正在检查argv[1]
是否不是NULL
。
如果argc
和argv
与运行时库传递给main()
的参数相同,则argv[1]
时argc >= 2
永远不会为NULL,所以最终的else
是无法访问的代码。但是,如果使用在别处获得的参数调用此函数,则没有这样的保证。
答案 1 :(得分:3)
这是一个 if-else if-else 阶梯。其中只有一个会一次运行。
所以,如果发送少于2个参数(如果是大小写),那么#34;没有足够的参数&#34;将打印,my_function()
将返回1,表示错误情况。
如果您发送的参数超过2个(argc >= 2
),而argv[1]
不是NULL
(否则 - 如果是这种情况),my_function()
将返回{{ 1}}。
最后,如果上述两个条件都是假的,即如果atoi(argv[1])
,argc >= 2 && NULL == argv[1]
将返回0.现在这在我看来是不正确的,因为返回0意味着成功,这显然不是案例在这里。
编辑:现在代码退出了else的情况,这似乎没问题。
答案 2 :(得分:2)
如果该函数是main
,那么你就是正确的。 argv[1]
不成立的唯一方法是argc < 2
。所以你永远无法到达第三个分支。
但由于它是一个单独的函数,你可以执行以下操作,第三个分支将触发。
int main(void) {
char *argv[] = { NULL, NULL };
int r = my_function(42, argv); // r == 0
}
(当然,没有理智的编码器会给出函数argc
和argv
参数,而不会使它们具有与main
相同的语义。)
答案 3 :(得分:2)
你是绝对正确的,假设argc
和argv
的“通常”语义。根据{{1}}函数中argv
和argc
的标准解释,第三个条款不太可能达到。
如果main()
,则argc >= 2
和argv[0]
指向以空字符结尾的argv[1]
字符串,而char*
是NULL指针。 argv[2]
唯一的方法是NULL指针,如果argv[1]
...已经被第一个if条件捕获了!
我认为这可以被视为非常安全的编码,但是如果事情被严重搞砸我就会让它崩溃。