【问题标题】:For loop with printf as arguments以 printf 作为参数的 for 循环
【发布时间】:2018-09-11 07:51:25
【问题描述】:

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

#include <stdio.h>

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

输出

10

【问题讨论】:

  • 也许您需要a printf reference 来查看它返回的内容
  • printf 返回打印的字符数。它可以打印110 或什么都不打印,这取决于它在哪个字符之后失败。
  • !printf("0") 返回 false。如果成功,printf 本身会返回打印的字符数。检查任何 c 参考以获取详细信息。
  • !printf("0") 表示!0... 不。鉴于printf 的结果,它表示!1FALSE

标签: c for-loop printf-debugging


【解决方案1】:

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

for(printf("1"); !printf("0"); printf("2"))
  • 执行第一条语句,总是(init条件),yieiding1
  • 然后测试条件:!printf("0") 打印 0,然后由于 printf 返回 1,因为它只打印 1 个字符,否定返回 0 并且永远不会进入循环,因为条件是错误的权利开始。所以2Sachin 都不会被打印出来。

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

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

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

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

【讨论】:

  • 无意冒犯先生,这段代码可能不实用,但对我来说它是实验性的,这对于更好地理解事情很重要。但是,我感谢您的帮助。 ?
  • 没有冒犯。我在我的回答中添加了这一点,所以每个人都明白,如果你想打印10,你只需做printf("10");
  • 如果你还需要换行符,只写puts("10");。 ;-)
  • aaah 是的,我想在不需要格式化时避免 printf :)
【解决方案2】:

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

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

现在为什么打印 10:

  • 第一个 printf("1") 打印 1。
  • 您的条件至少会测试一次,因此第二个printf("0") 出现一次(打印为 0)

【讨论】:

  • 很好的第一个答案。小建议:不要告诉人们“看谷歌”。为他们谷歌并包含链接。这样更好。
  • 感谢您的帮助。
【解决方案3】:
printf("1")

打印 1 并返回字符数 1

printf("0")

打印 0 并返回字符数 1

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

【讨论】:

  • 明白。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 2018-06-30
  • 2011-10-22
相关资源
最近更新 更多