为啥在下面的 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 条件计算为整数 0
或 1
。 C99 引入了false
作为在<stdbool.h>
中定义的宏,并且该宏仍然代表0
。
扩展@AnT C:条件(例如i > 9
)评估为0
或1
,但决定(在if
、while
等.) 取决于表达式的计算结果是 0
还是“不是 0
”。
for (i=3; 7; i--)
这个循环永远不会终止,因为 7 总是不为零。
@Kurt Stutsman:我的意思是 核心语言 不包括专用的布尔特定常量。即使是强硬的核心语言也包括一个专用的布尔类型_Bool
,这种类型仍然依赖0
和1
常量来表示“假”和“真”值。其他一切都是库级别的宏定义。【参考方案2】:
isspace(s[i])
是条件,因为它为“假”返回零值(即提供的字符不是空格字符),而为“真”返回非零值。在这种情况下,只存在一个空格字符,但在其他函数中,例如 isalpha
或 isalphanum
,非零值表示不同的东西,例如 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 循环中没有任何条件检查?的主要内容,如果未能解决你的问题,请参考以下文章