“ 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
。
这里有两件事在起作用:
逻辑 AND 和 OR 运算符的 short-circuit evaluation 语义
那个!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)。
找到这段负责打印二维数组的代码
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
。
这里有两件事在起作用:
逻辑 AND 和 OR 运算符的 short-circuit evaluation 语义
那个
!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)。