0

我的 if 语句在控制流方面起作用 - 即它捕获条件并相应地执行或通过(下面的第二个 if 语句)。但是,当我使用值 2 调用已编译的程序时./bankers.c 2, num_processes 的值恢复为 0 并将 0 打印到控制台,而不是 2。当我在 if() 之外取消对该函数的第二次调用时,它就可以工作了. 无论调用该函数是什么,它都不应该填充变量吗?我知道你可以在 if 语句中调用 fork() 函数。这更像是一个理论问题。

int num_processes = 1;
if (argv[1] == NULL)
{
    printf("Please enter an integer command line argument between 1 and 20 (exiting)\n\n");
    return 1;
}
else
{
    char *remainder;
    if (num_processes = strtol(argv[1], &remainder, 10) < 1)
    {
        fprintf(stderr, "Please request 1 or more processes (exiting)\n");
        return 2;
    }
    // num_processes = strtol(argv[1], &remainder, 10);
    printf("Rest of string: %s\n", remainder);
}
printf("Num processes %u\n", num_processes);
4

1 回答 1

1
if (num_processes = strtol(argv[1], &remainder, 10) < 1)

相当于

if (num_processes = (strtol(argv[1], &remainder, 10) < 1))

当你可能想要的是

if ((num_processes = strtol(argv[1], &remainder, 10)) < 1)

或者,更好的是,在 之外进行分配if以减少混淆:

num_processes = strtol(argv[1], &remainder, 10);
if (num_processes < 1)

顺便说一句,如果您增加警告选项,您的编译器可能会警告您这会造成混淆。以-Wallgcc 为例:

<source>:16:9: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   16 |     if (num_processes = strtol(argv[1], &remainder, 10) < 1)
      |         ^~~~~~~~~~~~~
于 2020-12-07T20:38:36.733 回答