0

听起来可能很傻,但我想知道执行 while(a = function(b)){} 时发生的情况。

假设 read_command_stream 的返回值为 NULL。

我可以跳出圈子吗?

while ((command = read_command_stream (command_stream)))
{
    if (print_tree)
    {
        printf("# %d\n", command_number++);
        print_command (command);
    }
    else
    {
        last_command = command;
        execute_command(command, time_travel);
    }
}

结构命令

struct command
{
  enum command_type type;

  // Exit status, or -1 if not known (e.g., because it has not exited yet).
  int status;

  // I/O redirections, or null if none.
  char *input;
  char *output;

  union
  {
    // for AND_COMMAND, SEQUENCE_COMMAND, OR_COMMAND, PIPE_COMMAND:
    struct command *command[2];

    // for SIMPLE_COMMAND:
    char **word;

    // for SUBSHELL_COMMAND:
    struct command *subshell_command;
  } u;
};
4

3 回答 3

3

语法说:

while (expression) { ... }

并且expression可能很多。有可能:

  • 一个常数:while (1) { ... }
  • 比较结果:while (a < b) { ... }
  • 一些布尔构造:while (a < b && c < d ) { ... }
  • 赋值的结果表达式:while (*dst++ = *src++) {;}
  • 并且赋值还可以涉及函数调用:while((ch = getc()) != EOF) { ... }
  • 一个普通的变量:while(i) ( ...)
  • 基于普通变量评估的表达式:(while (i--) { ... }即使有副作用!)
  • 指针表达式::while (*++argv) { ... }

现在,在整数表达式的情况下,检查表达式是否不等于零。对于指针表达式,检查不等于 NULL。就这样。

关键在于,在 C 中,即使赋值也是表达式,所以你可以这样写:

a = b = c;

甚至:a = b = c = d;

但是,由于赋值也是一个表达式,你甚至可以写:

while ( a = b = c = d) { ... }
于 2013-10-06T23:45:27.530 回答
1

The=评估为它将变量设置为的任何值,因此如果您执行类似
var = 0
This 评估为 0 的操作,并且如果它处于 while 循环中,则会中断。

还要记住NULL只是 0(尽管不能保证),所以返回的东西NULL将具有相同的效果以跳出循环。一般来说,使用 an=作为条件是个坏主意,好的编译器会警告你。

于 2013-10-06T23:41:05.907 回答
0

除非在您的系统/编译器上另有说明,否则 Null 应该为零。因此,循环终止。

于 2013-10-06T23:44:52.893 回答