我不明白为什么下面的代码输出10
。我理解的是那个!printf("0")
意思!0
,就是TRUE
。那么为什么代码不打印"Sachin"
#include <stdio.h>
int main() {
for (printf("1"); !printf("0"); printf("2"))
printf("Sachin");
return 0;
}
输出
10
我不明白为什么下面的代码输出10
。我理解的是那个!printf("0")
意思!0
,就是TRUE
。那么为什么代码不打印"Sachin"
#include <stdio.h>
int main() {
for (printf("1"); !printf("0"); printf("2"))
printf("Sachin");
return 0;
}
输出
10
让我们分析一下这个副作用循环语句:
for(printf("1"); !printf("0"); printf("2"))
1
!printf("0")
prints 0
, then sinceprintf
返回 1 因为它只打印 1 个字符,否定返回0
并且永远不会进入循环,因为条件从一开始就为假。所以两者都没有2
或被Sachin
打印。当然,这段代码不实用,几乎不可读。所以永远不要做这样的事情(例如,这puts("10");
是一个很好的选择)。
更多关于printf
(通常被忽略)的返回值:
成功返回后,这些函数返回打印的字符数(不包括用于结束输出到字符串的空字节)。
如果您查看 google 上的man printf参考资料,您会看到此函数返回写入的字节数。
这里你的条件是!printf("0")
,换句话说:“只要 printf 的返回不存在(或等于 0),就做点什么。但是你打印字符 '0' 所以 printf 实际上返回 1 所以你的条件是假的。
现在为什么打印 10 :
printf("1")
打印 1。printf("0")
发生一次(它打印 0)printf("1")
打印 1 并返回字符数 1
printf("0")
打印 0 并返回字符数 1
!1 表示 !(true) = false因此执行将停止,您将看到 10 作为输出。