什么是if语句检查?

时间:2016-03-18 04:31:19

标签: c

这是我从课堂上获得的一项功能。我只是对这里的流量控制感到困惑。第一个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);

}

4 个答案:

答案 0 :(得分:4)

您的理解是正确的 - else if声明正在检查argv[1]是否不是NULL

如果argcargv与运行时库传递给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
}

(当然,没有理智的编码器会给出函数argcargv参数,而不会使它们具有与main相同的语义。)

答案 3 :(得分:2)

你是绝对正确的,假设argcargv的“通常”语义。根据{{​​1}}函数中argvargc的标准解释,第三个条款不太可能达到。

如果main(),则argc >= 2argv[0]指向以空字符结尾的argv[1]字符串,而char*是NULL指针。 argv[2]唯一的方法是NULL指针,如果argv[1] ...已经被第一个if条件捕获了!

我认为这可以被视为非常安全的编码,但是如果事情被严重搞砸我就会让它崩溃。