2010-12-01 2 views
-2
void display() 
{ 
    printf("every thing is ok"); 
} 
void main() 
{ 
    int ch; 
    while(1) 
    { 
     printf("enter your choice"); 
     scanf("%d",&ch); 
     switch(ch) 

     { 
      case 1: clrscr();printf("when choice is one every thing is fine"); 
        display(); 
        break; 
      case 2: clrscr();printf("when chice is two its confusing"); 
        display(); 
        break; 
      case 3: exit(0); 
      default: printf("enter choice as 1 or 2 or to exit enter 3"); 
     } 
    } 
} 

Когда я отслеживаю эту программу на C и выбираю ее как 2, она вызывает функцию отображения из блока корпуса 1. Я этого не понимаю. Пожалуйста, ответьте с объяснением. Я действительно смущен.c switch statement

+0

У меня все в порядке. Что произойдет, если вы введете 1? Что значит «он вызывает функцию вытеснения из блока 1-го случая»? Дисплей() вызывается из обоих случаев 1 и 2 в код, который вы указали. – 2010-12-01 18:51:18

+1

Каков ваш ожидаемый результат и что вы видите? – casablanca 2010-12-01 18:51:19

ответ

4

Возможно, компилятор переустанавливает ваши исходные утверждения, сворачивая его basic blocks. Затем отладчик сопоставляет вызовы display() в обоих случаях с тем же номером исходной строки. Это обычно, когда оптимизация включена.

0

Ваш компилятор может что-то делать с оптимизацией, когда видит один и тот же вызов функции в двух разных случаях. Проверьте флаги компилятора и/или добавьте некоторые разные аргументы в display(), чтобы узнать, действительно ли он вызван, как вы указываете.

0

Компиляторы преобразуют код, чтобы сделать его более эффективным. Это может сбивать с толку при попытке отладки, поэтому вам следует, вероятно, отключить оптимизацию (как это сделать, зависит от вашего компилятора или IDE).

Если вы заметили в своем коде, что после printf заявления case 1 и case 2 идентичны, то вы должны понимать, что это может быть более эффективным, чтобы просто иметь один вызов display - один из случаев будет просто прыгать до последнего утверждение другого случая и результаты программы совпадают.

Вы можете пойти намного дальше, чем это. Так как единственное реальное различие междуи case 2 - это строка, на которой вы можете напечатать, вы можете иметь только одну копию всего блока кода, за исключением небольшого количества кода, который устанавливает указатель на строку, которая будет напечатана.