комбинированное использование сокращения c, если оператор else и разрыв в цикле привели к ошибке - PullRequest
0 голосов
/ 14 мая 2018

Я сейчас пишу логику подсчета очков для простой игры «Саймон говорит» и пытаюсь использовать сокращенное выражение if else ():

#include <stdio.h>
#include <string.h>

int main(void) {
   char simonPattern[50];
   char userPattern[50];
   int userScore;
   int i;

   userScore = 0;
   strcpy(simonPattern, "RRGBRYYBGY");
   strcpy(userPattern, "RRGBBRYBGY");

   for (i=0;i<10;i++){
      (simonPattern[i] == userPattern[i] )?( userScore++ ): (break);
      }


   printf("userScore: %d\n", userScore);

   return 0;
}

и эта строка вызвала ошибку при компиляции:

main.c:15:62: error: expected expression before ‘break’

Затем я попытался написать сокращенное выражение if в более традиционном формате:

  if (simonPattern[i] == userPattern[i]){
     userScore++;
     }
  else{
     break;
     }

Прошло без проблем, и программа работала без ошибок при подсчете баллов.

Я правильно использовал оператор if? Или просто не поддерживается использование оператора break в стенографии if?

Спасибо за помощь 101

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Операторы условного оператора ?: и if не являются совместимыми заменами.

Условный оператор может использоваться только со скалярными (арифметическими или указательными) операндами;его нельзя использовать для управления потоком программ.Так что он не может содержать break и тому подобное.Кроме того, он имеет несколько тонких ошибок, таких как неявное продвижение типов и проблемы с приоритетом операторов.Единственное преимущество ?: над if заключается в том, что оно возвращает значение.

Мое эмпирическое правило заключается в том, что если вы можете использовать if вместо ?:, то сделайте это.

Это дает более безопасный и (обычно) более читаемый код.Основное использование ?: - при написании различных функционально-подобных макросов (чего следует избегать в первую очередь).Существуют редкие исключения, когда ?: дает более читаемый код, но мой общий совет - просто избегать его.

0 голосов
/ 14 мая 2018

Проблема здесь в том, что вы пытаетесь использовать троичный условный оператор для вычисления операторов.Тернарный условный оператор в C должен использоваться для вычисления значений.Кроме того, логический аргумент условного оператора также должен быть выражением.

Тем не менее, некоторые операторы фактически оцениваются как выражения,

  int g = 5;
  int a = (g = 4);
  printf("g is %d, a is %d\n", g, a);

В результате на консоль будет выведено следующее:

g is 4, a is 4

Эти операторы также работают внутри троичного условного оператора:

  int g = 5;
  int a = 1 ? rand() % 5 : (g = 4);
  int c = 0 ? 3 : (g += a);
  printf("g is %d, a is %d, c is %d\n", g, a, c);

Что печатает

g is 8, a is 3, c is 8

Хорошее правило: условный оператор не можетоценивать по ключевым словам или компилировать временные элементы кода.В качестве аргументов могут приниматься только значения .

...