如果在C中,我可以用| |代替else吗?
我是C语言的新手,我正在努力改进我在一本书中找到的一个程序的源代码。我注意到源代码包含很多“else-if”条件,但结果相同,因此我尝试使用if函数中的| |运算符将它们压缩为较小的代码。 第1代码:如果在C中,我可以用| |代替else吗?,c,C,我是C语言的新手,我正在努力改进我在一本书中找到的一个程序的源代码。我注意到源代码包含很多“else-if”条件,但结果相同,因此我尝试使用if函数中的| |运算符将它们压缩为较小的代码。 第1代码: #include <stdlib.h> #include <stdio.h> int main(){ char card_name[3]; puts("Enter the card_name: "); scanf("%2s", card_name);
#include <stdlib.h>
#include <stdio.h>
int main(){
char card_name[3];
puts("Enter the card_name: ");
scanf("%2s", card_name);
int val = 0;
if (card_name[0] == 'K'){
val = 10;
} else if (card_name[0] == 'Q'){
val = 10;
} else if (card_name[0] == 'J'){
val = 10;
} else if (card_name[0] == 'A'){
val = 11;
} else {
val = atoi(card_name);
}
printf("The card name value is %i\n", val);
return 0;
}
#包括
#包括
int main(){
char card_name[3];
放入(“输入卡片名称:”);
scanf(“%2s”,卡片名称);
int-val=0;
如果(卡片名称[0]=“K”){
val=10;
}else if(卡片名称[0]=“Q”){
val=10;
}else if(卡片名称[0]=“J”){
val=10;
}else if(卡片名称[0]=“A”){
val=11;
}否则{
val=atoi(卡名);
}
printf(“卡名值为%i\n”,val);
返回0;
}
我的进步:
#include <stdlib.h>
#include <stdio.h>
int main(){
char card_name[3];
puts("Enter the card_name: ");
scanf("%2s", card_name);
int val = 0;
if (card_name[0] == 'K' || 'Q' || 'J' ){
val = 10;
} else if (card_name[0] == 'A'){
val = 11;
} else {
val = atoi(card_name);
}
printf("The card name value is %i\n", val);
return 0;
}
#包括
#包括
int main(){
char card_name[3];
放入(“输入卡片名称:”);
scanf(“%2s”,卡片名称);
int-val=0;
如果(卡片名称[0]='K'| | | Q'| | J'){
val=10;
}else if(卡片名称[0]=“A”){
val=11;
}否则{
val=atoi(卡名);
}
printf(“卡名值为%i\n”,val);
返回0;
}
我的问题是:当我写任何其他值时,它总是提示10。我该怎么办?问题在于
C
任何不是0
的东西都是真实的值,因此在你的代码中你有if(card_name[0]='K'| Q'| J')
。这将检查卡名[0]='K'是否为真,但这将始终计算为真,因为您有|Q'
,C
将'Q'
视为真值。这是正确的解决办法
#include <stdlib.h>
#include <stdio.h>
int main(){
char card_name[3];
puts("Enter the card_name: ");
scanf("%2s", card_name);
int val = 0;
if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
val = 10;
} else if (card_name[0] == 'A'){
val = 11;
} else {
val = atoi(card_name);
}
printf("The card name value is %i\n", val);
return 0;
}
#包括
#包括
int main(){
char card_name[3];
放入(“输入卡片名称:”);
scanf(“%2s”,卡片名称);
int-val=0;
如果(卡片名称[0]='K'| | |卡片名称[0]='Q'| |卡片名称[0]='J'){
val=10;
}else if(卡片名称[0]=“A”){
val=11;
}否则{
val=atoi(卡名);
}
printf(“卡名值为%i\n”,val);
返回0;
}
问题在于C
任何不是0
的东西都是真实的值,因此在你的代码中你有如果(卡名[0]='K'| Q'| J')
。这将检查卡名[0]='K'是否为真,但这将始终计算为真,因为您有|Q'
,C
将'Q'
视为真值。这是正确的解决办法
#include <stdlib.h>
#include <stdio.h>
int main(){
char card_name[3];
puts("Enter the card_name: ");
scanf("%2s", card_name);
int val = 0;
if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
val = 10;
} else if (card_name[0] == 'A'){
val = 11;
} else {
val = atoi(card_name);
}
printf("The card name value is %i\n", val);
return 0;
}
#包括
#包括
int main(){
char card_name[3];
放入(“输入卡片名称:”);
scanf(“%2s”,卡片名称);
int-val=0;
如果(卡片名称[0]='K'| | |卡片名称[0]='Q'| |卡片名称[0]='J'){
val=10;
}else if(卡片名称[0]=“A”){
val=11;
}否则{
val=atoi(卡名);
}
printf(“卡名值为%i\n”,val);
返回0;
}
这不是正确的表达式:
(card_name[0] == 'K' || 'Q' || 'J' )
由于'Q'和'J'不是0
,因此该值将始终为true
你应该写:
(card_name[0] == 'K') || (card_name == 'Q') || (card_name == 'J')
这不是正确的表达式:
(card_name[0] == 'K' || 'Q' || 'J' )
由于'Q'和'J'不是0
,因此该值将始终为true
你应该写:
(card_name[0] == 'K') || (card_name == 'Q') || (card_name == 'J')
if(卡名[0]='K'| | | | | Q'| | J')
应该是
if(卡片名称[0]='K'| |卡片名称[0]='Q'| |卡片名称[0]='J')
'Q'
将始终计算为true,您需要在每个or中进行完整比较。如果(卡名[0]='K'| | Q'| | J')
应该是
if(卡片名称[0]='K'| |卡片名称[0]='Q'| |卡片名称[0]='J')
'Q'
将始终计算为true,您需要在每个or中进行完整比较。检查if语句中的运算符优先级。如果你看这里,你会发现,==比| |具有更高的优先级
正确的if语句应如下所示:
if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
if ((card_name[0] == 'K') || (card_name[0] == 'Q') || (card_name[0] == 'J') ){
如果不确定运算符的优先级,可以使用以下括号:
if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
if ((card_name[0] == 'K') || (card_name[0] == 'Q') || (card_name[0] == 'J') ){
注:
您的代码不正确,因为
if(card_name[0]='K'| |'Q'| |'J')
被理解为if(card_name[0]='K'| | true | true)
始终为true检查if语句中的运算符优先级。如果你看这里,你会发现,==比| |具有更高的优先级
if (card_name[0] == 'K' || 'Q' || 'J' ){
val = 10;
}
正确的if语句应如下所示:
if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
if ((card_name[0] == 'K') || (card_name[0] == 'Q') || (card_name[0] == 'J') ){
如果不确定运算符的优先级,可以使用以下括号:
if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
if ((card_name[0] == 'K') || (card_name[0] == 'Q') || (card_name[0] == 'J') ){
注:
您的代码不正确,因为if(card_name[0]='K'| | |'Q'| |'J')
被理解为if(card_name[0]='K'| | true | | true)
if (card_name[0] == 'K' || 'Q' || 'J' ){
val = 10;
}
'Q'
,etc作为真值语句进行计算,由于char的值不是0,因此将始终是真值
应该是
if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
val = 10;
}
'Q'
,etc作为真值语句进行计算,由于char的值不是0,因此将始终是真值
应该是
if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
val = 10;
}
不,正如许多其他人指出的那样,使用
if(card_name[0]='K'| | |'Q'| |'J')
是错误的,他们还描述了为什么以及如何纠正它。但是,如果您真的只想用一种更简短的方式编写测试,可以使用switch
-语句:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char card_name[3];
puts("Enter the card_name: ");
scanf("%2s", card_name);
int val = 0;
switch (card_name[0]) {
case 'K': /* fallthrough */
case 'Q': /* fallthrough */
case 'J': val = 10; break;
case 'A': val = 11; break;
default: val = atoi(card_name);
}
printf("The card name value is %i\n", val);
return 0;
}
#包括
#包括
int main()
{
char card_name[3];
放入(“输入卡片名称:”);
scanf(“%2s”,卡片名称);
int-val=0;
交换机(卡名称[0]){
案例“K”:/*故障排除*/
案例“Q”:/*故障排除*/
案例“J”:val=10;中断;
案例“A”:val=11;中断;
默认值:val=atoi(卡片名称);
}
printf(“卡名值为%i\n”,val);
返回0;
}
请注意,
switch
语句不是C中if
-else if
的通用替换,因为每个案例都需要是常量整数表达式(粗略地表达,C语言书会正确地告诉您限制)。不,正如许多其他人所指出的,