1

我不明白为什么下面的代码输出10。我理解的是那个!printf("0")意思!0,就是TRUE。那么为什么代码不打印"Sachin"

#include <stdio.h>

int main() {
    for (printf("1"); !printf("0"); printf("2"))
        printf("Sachin");
    return 0;
}

输出

10
4

3 回答 3

8

让我们分析一下这个副作用循环语句:

for(printf("1"); !printf("0"); printf("2"))
  • 执行第一条语句,总是(init条件),yieiding1
  • 然后测试条件:!printf("0")prints 0, then sinceprintf返回 1 因为它只打印 1 个字符,否定返回0并且永远不会进入循环,因为条件从一开始就为假。所以两者都没有2或被Sachin打印。

当然,这段代码不实用,几乎不可读。所以永远不要做这样的事情(例如,这puts("10");是一个很好的选择)。

更多关于printf(通常被忽略)的返回值:

成功返回后,这些函数返回打印的字符数(不包括用于结束输出到字符串的空字节)。

(来自https://linux.die.net/man/3/printf

于 2018-09-11T07:58:19.417 回答
3

如果您查看 google 上的man printf参考资料,您会看到此函数返回写入的字节数。

这里你的条件是!printf("0"),换句话说:“只要 printf 的返回不存在(或等于 0),就做点什么。但是你打印字符 '0' 所以 printf 实际上返回 1 所以你的条件是假的。

现在为什么打印 10 :

  • 第一个printf("1")打印 1。
  • 您的条件至少被测试一次,所以第二次printf("0")发生一次(它打印 0)
于 2018-09-11T08:01:19.277 回答
0
printf("1")

打印 1 并返回字符数 1

printf("0")

打印 0 并返回字符数 1

!1 表示 !(true) = false因此执行将停止,您将看到 10 作为输出。

于 2018-09-11T08:51:29.613 回答