问题在于您的情况:
} while((temp!='x')||(temp!='X'));
这意味着:当它是不相等的“x”或“X”时重复。(这总是正确的,因为它只能是一个或另一个。将其替换为:
} while(temp != 'x' && temp != 'X');
当它不是“x”或“X”时重复。同样的问题在你的if
进一步发展中(我似乎第一次忽略了这一点,我的错)。
您的代码可能会像这样重构:
int main(){
chu input;
char temp;
while(true) {
printf("\nInput: ");
temp=getche();
if(temp != 'x' && temp != 'X')
printf("\nWrong input (only 'x' or 'X')");
else {
input.c=temp;
break;
}
}
}
此代码将永远循环(如 所示while(true)
),但只要您输入“x”或“X”,它就会将变量设置为您的结构并break
从循环中释放出来。
关于语义的一点信息:
||
一旦第一个条件返回,由 OR () 连接的任何内容都将停止计算true
。true
在那一刻,无论如何,整个构造都会返回。
相反,只要&&
第一个条件返回,您使用 AND ( ) 连接的任何内容都将停止评估,因为无论如何false
它都会生成整个构造。false
回到你的例子,这就是你的编译器所做的,假设我们输入'X'
if(temp != 'x') { //Okay, it's not 'x'. Let's try the next one.
if(temp != 'X') { //Oh wait, it IS X. I can't stop yet!
//Stop looping
} //This will be executed
}
//Loop me!
这就是它的作用&&
if(temp == 'x') { //Hmm...not 'x'.
if(temp == 'X') { //Oh wait! It IS 'X'.
//Stop looping //This gets executed.
}
}
//Loop me!
你可能已经注意到了,我改成!=
了==
这里。由于二进制算术,我可以做到这一点。NOT (x OR X) 等于 (NOT x AND NOT X)。