" for (int j = 0; j < n || !putchar('\n'); j++) " 是如何工作的

fer*_*kin 1 c boolean-expression

找到了这段代码,负责打印出一个二维数组

for (int i = 0; i < n; i++)
 for (int j = 0; j < n || !putchar('\n'); j++)
  printf_s("%4d", A[i][j]); 
Run Code Online (Sandbox Code Playgroud)

导致在每行末尾打印转义序列的布尔表达式如何工作?

bab*_*bon 6

因为||,该函数putchar只会在j < n为 false时被调用。现在,j < n在每一行的末尾都是假的。这就是为什么你\n在每一行的末尾。


Som*_*ude 5

这里有两件事在起作用:

  1. 短路计算的逻辑语义AND和OR运算

  2. !putchar('\n')将始终为“false”(putchar返回写入的字符 或EOF,在这种情况下两者均非零,因此为“true”)

虽然j < n为真,则||由于短路语义,将不会评估的右侧。当j < n为假时!putchar('\n')将被评估,它将打印一个换行符并返回一个“真”值('\n'EOF错误),这是由于!变为假,因此整个条件变为假,循环结束。

这是一个混淆的变体

for (int i = 0; i < n; i++)
{
    for (int j = 0; j < n; j++)
    {
        printf_s("%4d", A[i][j]); 
    }
    putchar('\n');
}
Run Code Online (Sandbox Code Playgroud)

我真的建议您不要使用(或更糟的是,编写)代码作为问题中显示的代码。混淆不是一件值得骄傲的事情(除非你进入IOCCC)。

  • 这种带有副作用的快捷方式在 bash 或 perl 等脚本语言中更常见,它是一种习惯用法。在 C* 中,这对于普通读者来说可能有点令人惊讶。 (2认同)