找到了负责打印二维数组的代码
for (int i = 0; i < n; i++)
for (int j = 0; j < n || !putchar('\n'); j++)
printf_s("%4d", A[i][j]);
导致每行末尾打印转义序列的布尔表达式如何工作?
答案 0 :(得分:6)
由于||
,仅在putchar
为假时才调用函数j < n
。现在,j < n
在每一行的末尾为假。这就是为什么您在每一行的末尾都得到\n
。
答案 1 :(得分:5)
这里有两件事在玩:
逻辑AND和OR运算符的short-circuit evaluation语义
!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)。