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
而不是 ?:
,那么就使用它。
这提供了更安全且(通常)更易读的代码。 ?:
的主要用途是在编写各种类似函数的宏时(这是首先应该避免的事情)。存在一些罕见的例外情况 ?:
确实提供了更具可读性的代码,但我的一般建议是远离它。
我现在正在为一个简单的游戏编写计分逻辑 "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
而不是 ?:
,那么就使用它。
这提供了更安全且(通常)更易读的代码。 ?:
的主要用途是在编写各种类似函数的宏时(这是首先应该避免的事情)。存在一些罕见的例外情况 ?:
确实提供了更具可读性的代码,但我的一般建议是远离它。