Переключить регистр с логическим оператором в C

Я новичок в C и нуждаюсь в помощи. Мой код следующий.

 #include  
 #include  
 void main()
 {

  int suite=2;  

  switch(suite)
     {           
      case 1||2:
      printf("hi");

      case 3:
      printf("byee");

      default:
      printf("hello");
     }

  printf("I thought somebody");
  getche();
  }

Я работаю в Turbo C и выводhelloI thought somebody, Там'Нет сообщения об ошибке.

Пожалуйста, дайте мне знать, как это работает.

 Aniket Inge05 нояб. 2012 г., 06:24
@ErAvinashSingh у вас есть выбор, вы можете использовать GCC на окнах с MinGW или Cygwin
 Jeremy J Starcher05 нояб. 2012 г., 06:04
@Er - вне форматирования, это был отличный первый вопрос. Хорошая краткая выдержка, дополненная выводом, который вы из нее получили, и упоминанием об ошибках. Желаю всем опубликованным вопросам это хорошо.
 Er Avinash Singh05 нояб. 2012 г., 06:20
@Aniket: - Да, на самом деле я использую gcc в Linux, но так как моя система не работает, у меня нет выбора.
 Aniket Inge05 нояб. 2012 г., 06:24
Вы также можете скачать Visual Studio 2012 Express для рабочего стола и взломать!
 Jeff Mercado05 нояб. 2012 г., 05:57
Вы должны встретиться с моими друзьями: Enter и пробел. Они действительно великолепны и могут сделать ваш код тоже великолепным, если вы их хорошо спросите.
 Rodrigo de Azevedo12 июн. 2018 г., 14:43
 Aniket Inge05 нояб. 2012 г., 06:07
также, пожалуйста, напишитеint main(void) и прекратить использованиеvoid main() и что более важно, прекратите использовать TurboC
 Bob Kaufman05 нояб. 2012 г., 05:57
Спасибо @Aniket ...
 Aniket Inge05 нояб. 2012 г., 05:58
@BobKaufman Я отредактировал только частично - часть его никогда не сохранялась. Спасибо DaoWen также :-)
 David Schwartz05 нояб. 2012 г., 06:04
Вы получите гораздо более полезные ответы, если объясните, что вы ожидали и почему. Я могу придумать несколько разных способов, что это может не сработать, как вы ожидаете, и этоВполне возможно, что вы ожидаете чего-то совершенно другого. Я'Я не уверен, как мы можем объяснить, почему это неделать то, что вы ожидаете, не зная, что вы ожидаете, кроме как угадать правильно. (Вы ожидаетеcase 1||2: вести себя какcase 3:? Или какcase 1: case 2:? Или что?)
 Er Avinash Singh05 нояб. 2012 г., 06:21
хорошо, я буду реализовывать это спасибо.

Ответы на вопрос(5)

case 1||2:

true, так case 1: но переданное значение равно 2., поэтому выполняется случай по умолчанию. После этого вашprintf("I thought somebody"); казнены.

 Jeyaram05 нояб. 2012 г., 06:14
рад, что ты понял ....
 Jeremy J Starcher05 нояб. 2012 г., 06:00
+1 за объяснение, почему код ОП не действовал так, как он ожидал.
 Er Avinash Singh05 нояб. 2012 г., 06:12
ну да, я думал, что это работает как EITOR 1 или 2 дело .. но кажется, что это работает иначе

сделай это:

switch(suite){
  case 1:/*fall through*/
  case 2: 
    printf("Hi");
...
}

Это будет намного более чистый способ сделать это. Выражение1||2 оценивает1, посколькуsuite был 2, он не будет ни соответствовать ни 1, ни 3, и перейти кdefault дело.

 Aniket Inge05 нояб. 2012 г., 05:59
@JeffMercado спасибо, я мог бы посмотреть, как они работают. Человек 8 лет с C и кое-что из этого все еще возвращается и обучает меня
 Aniket Inge05 нояб. 2012 г., 06:05
ах да @DaoWen я проверил с моим компилятором. 1 || 2 оценивается как 1, что верно. А также...
 Er Avinash Singh05 нояб. 2012 г., 06:14
@JeffMercado: - Да, ты прав. Я тоже получил то же самое. Спасибо
 Jeff Mercado05 нояб. 2012 г., 05:57
Oни'разрешено ... только что выигралне работает, как он мог ожидать.
 DaoWen05 нояб. 2012 г., 06:04
Аникет - С тех порнет логического типа в C (онипросто целые) компилятор будет делать постоянное сворачивание на1||2как это было бы на0+1и вы в конечном итогеcase 1 а не1 или 2 что пользователь может ожидать, если онипроисходит от языка с полным сопоставлением с альтернативами.
case 1||2:

Результаты в

case 1:

так как1 || 2 оценивает1 (и помните, только постоянные интегральные выражения допускаются вcase операторы, поэтому вы не можете проверить несколько значений в одномcase).

Вы хотите использовать:

case 1:
  // fallthrough
case 2:
 Jeremy J Starcher06 нояб. 2012 г., 00:40
NP. Я знаю, мне нравится, когда люди ужесточают мою формулировку.
 Jeremy J Starcher05 нояб. 2012 г., 06:07
1||2 постоянная В какой-то момент компилятор уменьшил бы это значение. Скорее всего при разборе времени.
 Ed S.05 нояб. 2012 г., 22:57
@JeremyJStarcher: я нене хочу сказать, что это неt (и я показал, к чему это сводится в моем первом примере), я подумал, что ОП хотел один и тот же случай для 1 и 2. Однако, читая его еще раз, я определенно сформулировал это в замешательстве. Я'исправлю, спасибо.

switch по стоимости2, который соответствуетdefault дело вswitch Заявление, так что печатаетПривет" а потом последняя строка печатаетЯ думал, что кто-то ".

case (1||2):
  printf("hi");

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

Но если вы укажете, что оба термина, то есть 1 и 2, взяты вместе, используя скобки, все будет работать так, как вам нужно.

 Fabio Turati21 сент. 2016 г., 00:07
Я сомневаюсь, что это работает. Какой компилятор вы используете?
 Harpreet Vishnoi21 сент. 2016 г., 22:51
Я попробовал это в GCC. Оно работает.

Ваш ответ на вопрос