为啥在下面的 for 循环中没有任何条件检查?

Posted

技术标签:

【中文标题】为啥在下面的 for 循环中没有任何条件检查?【英文标题】:Why isn't there any condition checking in the following for loop?为什么在下面的 for 循环中没有任何条件检查? 【发布时间】:2016-03-21 16:33:35 【问题描述】:
for (i = 0; isspace(s[i]); i++)  ... 

上面的for循环是第61页K&R中将字符串转换为整数的程序的一部分。

for 循环中没有条件检查。它是如何工作的?

【问题讨论】:

不是isspace(s[i])这个条件吗? @DoctorMick 不知道,循环是如何工作的? 它递增 i 直到 s[i] 不再是空白字符。 注意,在 C 语言中,零被认为是false,其他的都被认为是true @tofro 不,代码假定它正在处理一个以 0 字节终止的字符串,并且 isspace() 将在该点返回 0 【参考方案1】:

只要条件表达式的计算结果为 0,循环就会终止。例如,如果您看到像 i < 3 这样的表达式,您可以将其视为 (i < 3) != 0。所以在这种情况下,它是isspace(s[i]) != 0,这意味着它在第一个不是空格的字符处终止。

【讨论】:

@DoctorMick 那里有某种语义。 C 甚至没有布尔类型。那时 true 是任何可以衰减为不等于 0 的整数值的值。由于 false == 0,这并不重要。 @DoctorMick:这是 C。C 没有 false。 C 条件计算为整数 01。 C99 引入了false 作为在<stdbool.h> 中定义的宏,并且该宏仍然代表0 扩展@AnT C:条件(例如i > 9)评估为01,但决定(在ifwhile等.) 取决于表达式的计算结果是 0 还是“不是 0”。 for (i=3; 7; i--) 这个循环永远不会终止,因为 7 总是不为零。 @Kurt Stutsman:我的意思是 核心语言 不包括专用的布尔特定常量。即使是强硬的核心语言也包括一个专用的布尔类型_Bool,这种类型仍然依赖01 常量来表示“假”和“真”值。其他一切都是库级别的宏定义。【参考方案2】:

isspace(s[i]) 是条件,因为它为“假”返回零值(即提供的字符不是空格字符),而为“真”返回非零值。在这种情况下,只存在一个空格字符,但在其他函数中,例如 isalphaisalphanum,非零值表示不同的东西,例如 1 表示它是一个大写字母(因此它是一个字母字符),或 2 表示它是一个小写字母)等等(我可能把这些数字弄混了:/)。

换句话说,for 循环将此函数视为返回布尔值,就像大多数其他表达式一样,这意味着它将零值视为false,将非零值视为true

【讨论】:

【参考方案3】:

首先,你会越界,这会给你一个段错误。您只是增加了i,但没有检查它是否仍在边界内。例如,如果s 等于" " 会怎样? isspace(i[0]) 将返回一个非零值(视为真),循环将继续并尝试访问 s 的第二个(不存在!)值。你最好再加一张小支票:for (i = 0; (i<SIZE_OF_S) && isspace(s[i]); i++) ...

现在让我们谈谈缺失条件。不,它没有丢失,它在这里:isspace(s[i])。这个函数检查s[i] 是否被认为是空间。如果是,则返回非零值,否则返回 0 (docs)。所以,它是缺失条件,只是形式略有不同(也许你习惯了不同的比较,但还有更多的方法。

【讨论】:

严格来说,isspace() 在条件为真时返回一个非零值。它不一定等于1 @KurtStutsman,是的,这就是文档存在的原因:如果我有点错误,请纠正我。将在一分钟内编辑此内容 @ForceBru 我可以再举一个例子吗? @GireeshKumar,what 的另一个例子? @ForceBru 谢谢不用再举例了,我明白了..我解释了我的理解【参考方案4】:

是如果for循环没有条件检查,只要条件部分为零,for循环就会退出

例如

` 诠释我;

for (i=0; 7-i; i++)
printf("hello world \n");
getch();
return 0;

`

看上面的程序,'i'每次减去七。并且只要条件部分的值为零(即7-7),循环就会退出。

【讨论】:

以上是关于为啥在下面的 for 循环中没有任何条件检查?的主要内容,如果未能解决你的问题,请参考以下文章

为啥'for'循环条件失败? [复制]

没有循环的 if/else 的 Numpy 等价物

为啥我的 for 循环在“继续”之后没有重新评估条件?

仅在第一个周期中检查条件,在其余周期中执行一些代码

如果条件匹配两个“for 循环”中的两个字符串

如何在 C++ 中展开嵌套的 for 循环?