shorthand c if else 语句和 break 在循环中的结合使用导致错误

combined usage of shorthand c if else statement and break in a loop resulted an error

我现在正在为一个简单的游戏编写计分逻辑 "Simon says" 并尝试使用缩短的 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语句?或者只是不支持在 shorthand if 语句中使用 break?

感谢帮助!

这里的问题是您试图使用 ternary conditional operator 来计算 to 语句。 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

要遵循的一个好规则是,条件运算符不能计算关键字或代码的编译时元素。它只能将作为参数。

条件运算符 ?:if 语句不是兼容的替代品。

条件运算符只能与标量(算术或指针)操作数一起使用;它不能用于程序流控制。所以它不能包含 break 和类似的。此外,它还伴随着一些微妙的问题,例如隐式类型提升和运算符优先级问题。 ?: 相对于 if 的唯一优势在于它 returns 是一个值。

我的经验是,如果你可以使用 if 而不是 ?:,那么就使用它。

这提供了更安全且(通常)更易读的代码。 ?: 的主要用途是在编写各种类似函数的宏时(这是首先应该避免的事情)。存在一些罕见的例外情况 ?: 确实提供了更具可读性的代码,但我的一般建议是远离它。