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

how does " for (int j = 0; j < n || !putchar('\n'); j++) " work

找到这段负责打印二维数组的代码

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

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

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

这里有两件事在起作用:

  1. 逻辑 AND 和 OR 运算符的 short-circuit evaluation 语义

  2. 那个!putchar('\n')永远是"false"(putchar return是写的字符或EOF,两者都在这种情况非零,因此 "true")

虽然 j < n 为真,但由于短路语义,|| 的右侧将不会被计算。当 j < n 为 false 时 !putchar('\n') 将被评估,它会打印一个换行符和 return 一个 "true" 值('\n'EOF错误)由于 ! 变成假所以整个条件变成假并且循环结束。

这是

的混淆变体
for (int i = 0; i < n; i++)
{
    for (int j = 0; j < n; j++)
    {
        printf_s("%4d", A[i][j]); 
    }
    putchar('\n');
}

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