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

时间:2017-11-06 19:01:11

标签: c switch-statement

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

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.story_list, name='story_list'),
    url(r'^storyauthor/(?P<pk>\d+)$', 
    views.StoryListbyAuthorView.as_view(), name='stories_by_author'),
]

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

5 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:5)

首先,将requires the case`表达式切换为常量,因此不允许使用表达式。

但即使表达式被允许(因为它已经复制了大部分C的语法,如PHP和Javascript),它也不会做你想要的。声明

case <value>:

类似于:

if (answer == (<value>))

所以如果你写:

case ('N' || 'n'):

就像:

if (answer == ('N' || 'n'))

表达式'N' || 'n'被评估为布尔值,返回1。所以它相当于:

case (1):

这显然不是你想要的。

您可以使用

switch (tolower(answer)):

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

case 'N':
case 'n':

答案 2 :(得分:4)

案例的常量表达式必须与交换机中的变量具有相同的数据类型,并且必须是常量或文字。

执行以下操作:

case 'Y':
case 'y':
     printf("Got a Y!");
     break;

答案 3 :(得分:2)

因为给case的值不是布尔值。

您可以使用堕落来达到您想要的效果:

switch(answer) {
    case 'Y':
    case 'y':
          printf... etc

答案 4 :(得分:2)

Switch需要常量表达式。 你有两个选择:

1)使用堕落

switch (answer)
{
case 'a':
case 'b':

    <code for 'a' or 'b'>

    break;
}

2)在这种特殊情况下,您可以使用与tolower函数类似的内容来标准化输入。例如:

switch (tolower(answer))
{
case 'a':
    <code for 'a' or 'A'>

    break;
}