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

时间:2019-12-10 07:05:12

标签: 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]); 

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

2 个答案:

答案 0 :(得分:6)

由于||,仅在putchar为假时才调用函数j < n。现在,j < n在每一行的末尾为假。这就是为什么您在每一行的末尾都得到\n

答案 1 :(得分:5)

这里有两件事在玩:

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

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

虽然j < n为真,但由于短路语义,将不评估||的右侧。如果j < n为假,则将对!putchar('\n')进行求值,它将打印换行符并返回“ 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)。