с переключателем - PullRequest
       1

с переключателем

0 голосов
/ 01 декабря 2010
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");
        }
    }
}

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

Ответы [ 3 ]

4 голосов
/ 01 декабря 2010

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

0 голосов
/ 02 декабря 2010

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

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

Вы можете пойти намного дальше, хотя.Поскольку единственной реальной разницей между case 1 и case 2 является напечатанная строка, у вас может быть только одна копия всего блока кода, за исключением небольшого фрагмента кода, который устанавливает указатель на строку, которая будет напечатана.

0 голосов
/ 01 декабря 2010

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

...