繁体   English   中英

使用变量用于switch case语句

[英]Using variable for switch case statement

# include <stdio.h>

int main(void)
{
    int var=1, x=1, y=2;
    switch(var)
    {
        case 'x':
            x++;
            break;
        case 'y':
            y++;
            break;
    }
    printf("%d %d",x,y);
    return 0;
}

在这里,我没有得到所需的输出任何人都可以解释为什么?

我的预期输出是:2,2

在switch语句(C语言),你可以不使用变量case 你必须使用常数。

而且, case 'x':不是指变量x而是指一个常量'x' ,它是一个char。 你没有测试你想要的东西......在这种情况下,你正在测试case 121: :,其中121是字母'x'的ascii代码。

您可以通过以下方式解决问题:

# include <stdio.h>

#define INIT_X 1
#define INIT_Y 2
// ^^^^^^^^^^^^^

int main(void)
{
    int var=1, x=INIT_X, y=INIT_Y;
    //         ^^^^^^^^^^^^^^^^^^
    switch(var)
    {
        case INIT_X:
        //   ^^^^^^
            x++;
            break;
        case INIT_Y:
        //   ^^^^^^
            y++;
            break;
    }
    printf("%d %d",x,y);
    return 0;
}

你误解了switch语句。

switch语句将switch (expression)的表达式(通常是一个简单变量)与各种case标签中的一系列不同的编译时常量值进行比较,并在该标签之后执行代码。 如果该值与任何显式case标签都不匹配,则使用default标签(如果存在),或者如果没有default标签则跳过整个switch

在代码中, var设置为1 两种case 'x':都不是case 'x':也不是case 'y':匹配1 (它们等同于case 120:case 121:在大多数基于ASCII的代码集中),并且没有default ,因此跳过了switch ,并且输出为1 2 (不是,正如您所预期的那样, 2 2 )。

什么是编译时常量?

案例标签中的值必须由编译器在编译代码时确定,并且必须是常量表达式。 这意味着case标签中的表达式不能引用变量或函数,但它们可以对固定(整数)值使用基本计算。

鉴于:

#include <math.h>
const int x = 3;               // C++ compilers treat this differently
enum { BIG_TIME = 60 };
#define HOURS(x) (3600 * (x))

case sin(x):     // Invalid - function of a variable
case x:          // Invalid - variable
case sin(0.0):   // Invalid - function
case 'x':        // Valid - character constant
case 'xy':       // Valid but not portable
case BIG_TIME:   // Valid - enumeration value names are constant
case HOURS(2):   // Valid - expands to (3600 * (2)) which is all constant

您不能在case使用变量,因为值必须是编译时常量。 你的代码也不正确,因为'x''y'是常量(文字),因此不引用变量xy

在引号中使用'x'实际上是使用字符x的常量ASCII代码值,实际上是数字值120(根据ASCII图表)。 它不使用您声明的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM