切换如果和否则不会产生相同的结果
我一直在通过K & R在C编程语言中的一些例子,但我对我在练习1-12中做过的测试感到困惑我切换了if和else语句。切换如果和否则不会产生相同的结果
问题是:编写一个程序,每行打印一个字的输入。
所以基本上要测试出\ n而忽略单词之间的多个空格,我首先写了这个。
#include <stdio.h>
int main()
{
int c;
while ((c = getchar()) != EOF) {
if (c == ' ' || c == '\t') {
printf("\n");
}
else {
putchar(c);
}
}
}
在这其中,就在看到空格或制表符打印出一个新的段落,如果没有,然后将其复制完全输入。
此代码产生了我想要的结果(当然还有来自多余的空格中输入单词之间还额外段落,但我忽略了现在)
然后,我决定看看发生了什么,如果我切换我的if和else语句在改变条件的时候,但事实证明结果是不一样的。
#include <stdio.h>
int main()
{
int c;
while ((c = getchar()) != EOF) {
if (c != ' ' || c != '\t') {
putchar(c);
}
else {
printf("\n");
}
}
}
在这一个,我希望它打印出不是空白或选项卡,如果不是,它会创建一个新的段落。
我预计新的条件会产生相同的结果。相反,它只是复制我输入的内容。有谁知道为什么这不起作用?
if (c != ' ' || c != '\t') {
这种情况进行检查以查看是否c
要么是不是空格,或c
不是标签。这总是如此,因为c
不能同时是空格和标签。请尝试:
if (c != ' ' && c != '\t') {
您可以在De Morgan's Laws更详细地阅读此原则。
另一种方法是让编译器做的逻辑否定你:
if (!(c == ' ' || c == '\t')) {
然而,有些人(包括我)就认为很难,因为额外的括号和对微小!
读剩下。
的反面:
if (c == ' ' || c == '\t') {
(参数c
或者是一个空格或标签)
是:
if (c != ' ' && c != '\t') {
(参数c
既不是空间,也不是标签)
||
应该是陈成为&&
。
感谢您的回复!现在有道理。 – user1604449 2012-08-16 22:29:25
我想你是指'if(!(c ==''|| c =='\ t')){'。 :-) – MRAB 2012-08-16 22:23:22
@MRAB:哦,天啊。谢谢! – 2012-08-16 22:23:55
我看到现在发生了什么事。这一个让我陷入了一段时间。谢谢! – user1604449 2012-08-16 22:28:58