Неожиданное поведение Switch-Case в C

Я столкнулся с проблемой в книге, когда я запустил код в MSDOSBox TurboC++ для Windows 7, он показал мне неожиданное поведение: -

код был следующим: -

#include <stdio.h>
#include <conio.h>
void main()
{
   char s = 3;
   switch(s)
   {
       case 1 :
       printf("\nDiamond");
       break;
       case 2 :
       printf("\nSpades");
       break;
       default :
       printf("\nHeart");
       break;
   }
   printf("\nI thought something like this");
   getch();
}

теперь проблема была…

оператор в случае по умолчанию никогда не печатался. он только напечатал "Я думал что-то вроде этого"

Я понял, что в switch-case char рассматривается как его значение в коде ASCII.

Ну… здесь значение char s было указано 3, а не «3», но опять же, по крайней мере, должен быть напечатан регистр по умолчанию, даже если значение не похоже ни на один из случаев.

ну... если это поможет..

я пытался поставить

case 3 :

вместо

default :

теперь оператор, т.е. printf("\nHeart"); был казнен и напечатано "Сердце" на экране


person Pawan Joshi    schedule 23.11.2013    source источник
comment
Во-первых, почему вы до сих пор используете TURBO C COMPILER?   -  person Kevin Dong    schedule 23.11.2013
comment
У меня отлично работает с компилятором MS C...   -  person Jon Skeet    schedule 23.11.2013
comment
Извините ребята . . на самом деле это был MSDOSBox TurboC++   -  person Pawan Joshi    schedule 23.11.2013
comment
GCC, MinGW GCC, MSVC и т. д. Первые 2 определенно бесплатны и доступны.   -  person Pandacoder    schedule 23.11.2013
comment
Ну, Совершенно Фантастический, MSDOSBox PLUS TurboC++ !!!!!!!   -  person Kevin Dong    schedule 23.11.2013
comment
Ребята . . у вас есть какое-нибудь решение?   -  person Pawan Joshi    schedule 23.11.2013
comment
В DOS (не уверен, что это относится к вашему компилятору, но некоторые точно) вы можете попробовать заменить \n на \r\n. В случае, если компилятор каким-то образом переназначает переводы строк, он может выводить строку по умолчанию, но немедленно перезаписывать эту строку с помощью printf в конце.   -  person Joachim Isaksson    schedule 23.11.2013
comment
Turbo C++ имеет приличный отладчик, пошаговый код.   -  person Retired Ninja    schedule 23.11.2013
comment
Поэтому удалите последний printf вашей программы и посмотрите, печатается ли Heart.   -  person mcleod_ideafix    schedule 23.11.2013
comment
Если вам нужна небольшая, современная, кроссплатформенная, актуальная среда разработки, я предлагаю вам загрузить Code::Blocks с MinGW (codeblocks.org/downloads/26 — загрузите 96 МБ. Если вы хотите, чтобы отраслевой стандарт был дополнен непревзойденным отладчиком и миллионной пользовательской базой, загрузите Visual Studio Express. Инструменты бесплатны, почему бы не использовать лучшие для работы?   -  person enhzflep    schedule 23.11.2013
comment
Я думаю, что это может быть проблема с кодировкой, и убедитесь, что она закодирована как ANSI.   -  person Kevin Dong    schedule 23.11.2013
comment
Или... попробуйте int s = 3; !   -  person Kevin Dong    schedule 23.11.2013
comment
Или... попробуйте case 1 :;, case 2 :; и default :;   -  person Kevin Dong    schedule 23.11.2013
comment
Оба из перечисленных выше помогают?   -  person Kevin Dong    schedule 23.11.2013
comment
@KVD: это был проблемный вопрос из книги. как изменить вопрос? ..ха-ха-ха :D   -  person Pawan Joshi    schedule 23.11.2013
comment
@DemonSocket Даже в GCC иногда происходит сбой, если после colon нет semicolon. Может быть tokens bug!   -  person Kevin Dong    schedule 23.11.2013
comment
Подождите секунду, как насчет разборки?   -  person Kevin Dong    schedule 23.11.2013
comment
Вставил ваш точный код из вопроса в TurboC++ 3.0, он без проблем печатает Heart.   -  person Joachim Isaksson    schedule 23.11.2013
comment
Я подозреваю, что код, который вы используете, как-то отличается от того, что вы опубликовали. В противном случае я подозреваю колдовство как следующую наиболее вероятную возможность.   -  person Baldrick    schedule 23.11.2013


Ответы (1)


Вы вырезали/вставили этот код из исходного кода или перепечатали его? Если вы перепечатали его, вернитесь и убедитесь, что вы правильно написали default в оригинале.

Распространенная ошибка, которая обычно не вызывает предупреждения от компилятора, заключается в том, что для этой последней метки набирается что-то вроде defualt вместо default.

person Joe Z    schedule 23.11.2013
comment
@mcleod_ideafix Нет, он запишет это как место перехода. - person Caesar; 23.11.2013
comment
@Joe: нет, это был правильный код, который я набрал, ну… когда я поставил case 3 : вместо значения по умолчанию: оператор был напечатан, т.е. Сердце - person Pawan Joshi; 23.11.2013
comment
@Caesar Хм, разрыв внутри переключателя, но вне возможного потока дела, все равно должен вызывать предупреждение, хотя с этим компилятором, я думаю, мне нужно помнить старые добрые времена компиляторов, которые не предупреждают о коде, который может быть неправильным. , просто проблемы с синтаксисом :) - person Joachim Isaksson; 23.11.2013
comment
@mcleod_ideafix: Почему это ошибка синтаксического анализа? Это вполне допустимый ярлык, который вы могли бы goto. - person Joe Z; 23.11.2013
comment
@KVD: Если ваша среда DOSBox + TurboC не подключается к буферу обмена Windows ... (я понятия не имею, делает ли это). - person Joe Z; 23.11.2013
comment
ребята . . сердце печатается, когда я помещаю это в случай 3: но не по умолчанию: - person Pawan Joshi; 23.11.2013
comment
@DemonSocket: я это понимаю. Можете ли вы опубликовать скриншот вашего исходного кода в среде IDE? - person Joe Z; 23.11.2013
comment
@DemonSocket Может быть, вы можете загрузить исходный файл cpp. - person Kevin Dong; 23.11.2013