为什么你不能使用|| 在开关盒?

and*_*nho 0 c switch-statement

我目前正在学习C编程的基础知识,并且即将尝试使用switch语句.我的问题是:

switch (answer)
    {
    case ('Y' || 'y') :
        printf("\nYay! Me too. ");
        break;
    case ('N' || 'n')  :
        printf("\nBoo! :(");
        break;

    default:
        printf("\nInput error!");
        break;
    }
Run Code Online (Sandbox Code Playgroud)

为什么我不能写一个|| 在我的不同情况下?

Dar*_*der 6

switch case不支持逻辑操作.在您的情况下,解决方案很简单:

switch (answer)
{
case 'Y':
case 'y':
    printf("\nYay! Me too. ");
    break;
case 'N':
case 'n':
    printf("\nBoo! :(");
    break;

default:
    printf("\nInput error!");
    break;
}
Run Code Online (Sandbox Code Playgroud)


Bar*_*mar 5

首先,将requires thecase`表达式切换为常量,因此不允许表达式.

但即使表达式被允许(因为它在其他语言中复制了大部分C的语法,如PHP和Javascript),它也不会做你想要的.该声明

case <value>:
Run Code Online (Sandbox Code Playgroud)

类似于:

if (answer == (<value>))
Run Code Online (Sandbox Code Playgroud)

所以,如果你写:

case ('N' || 'n'):
Run Code Online (Sandbox Code Playgroud)

就像是:

if (answer == ('N' || 'n'))
Run Code Online (Sandbox Code Playgroud)

表达式'N' || 'n'被计算为布尔值,返回1.所以它相当于:

case (1):
Run Code Online (Sandbox Code Playgroud)

这显然不是你想要的.

你可以使用

switch (tolower(answer)):
Run Code Online (Sandbox Code Playgroud)

然后你只需要与小写字母进行比较,或者你可以使用多个case语句的连贯行为:

case 'N':
case 'n':
Run Code Online (Sandbox Code Playgroud)