2013-07-10 3 views
2
# 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; 
} 

здесь я не получаю требуемый результат Может ли кто-нибудь объяснить это почему?Использование переменной для оператора case switch

Мой Ожидаемый результат: 2,2

+2

'var' не' x' или 'y', это' 1'. Каким будет ваш ожидаемый результат? –

+0

, но x имеет значение 1, поэтому почему я не получаю выход 2,2 –

+0

Каков требуемый выход? –

ответ

9

В распределительном заявление (в C), вы не можете использовать переменные в case. Вы должны использовать константу.

А также, case 'x': не относятся к переменной x, а к константе 'x', которая является символом. Вы не тестируете то, что вам кажется нужным ... В этом случае вы тестируете case 121:, где 121 - код ascii для буквы «x».

Вы можете решить вашу проблему с чем-то вроде:

# 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; 
} 
+0

Получил, спасибо, Пьер за помощь ур –

2

Вы не можете использовать переменные в case в качестве значения должны быть постоянными во время компиляции. Также ваш код неверен, поскольку 'x' и 'y' являются константами (литералами) и, следовательно, не относятся к переменным x и y.

8

Вы неправильно понимаете заявление switch.

Оператор switch сравнивает выражение (часто простую переменную) в switch (expression) с рядом различных значений константы времени компиляции в различных меток case и выполняет код после этой метки. Если значение не соответствует ни одной из ярлыков case, тогда используется метка default, или весь switch пропускается, если нет метки default.

В вашем коде у вас есть var, установленный в 1. Ни case 'x': ни case 'y': матчи 1 (они не были бы эквивалентны case 120: и case 121: в большинстве кодировок на основе ASCII), и нет default, поэтому switch пропускается, и выход 1 2 (не так, как вы, кажется, ожидали , 2 2).

Что такое постоянная времени компиляции?

Значения в метках case должны определяться компилятором при компиляции кода и должны быть постоянными выражениями. Это означает, что выражения в метках 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 
+0

Не могли бы вы объяснить о постоянной времени компиляции? –

+0

, и если я использую только x и y вместо 'x' и 'y'? –

+2

Это не будет действительное выражение C, даже если некоторый компилятор примет это. –

2

с использованием «х» в кавычках, на самом деле использует постоянное значение ASCII-кода для символа х, которая на самом деле значение 120 номер (в соответствии с ASCII диаграмма). Он не использует указанную переменную.

Смежные вопросы