我是C的新手,我正在努力改进我在书中找到的程序源代码。我注意到源代码包含很多“else if”条件但结果相同,所以我尝试使用||将它们压缩成更小的代码if函数中的运算符。 第一个代码:
#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;
}
我的改进:
(.//*[contains(@class,'wfm-statusbar')])[1]/descendant::*[@type='checkbox' and @disabled='disabled']
我的问题:当我写任何其他值时,它总是提示10.我该怎么办?
答案 0 :(得分:4)
问题出在C
,任何非0
的内容都是真正的价值,所以在你的代码中你有if (card_name[0] == 'K' || 'Q' || 'J')
。这会检查card_name[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;
}
答案 1 :(得分:1)
这不是正确的表达方式:
(card_name[0] == 'K' || 'Q' || 'J' )
这将始终评估为true,因为'Q'和'J'不是0
。
你应该写:
(card_name[0] == 'K') || (card_name == 'Q') || (card_name == 'J')
答案 2 :(得分:1)
if (card_name[0] == 'K' || 'Q' || 'J' ){
val = 10;
}
'Q'
等被评估为真值陈述,因为char的值不是0将始终为true
应该是
if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' ){
val = 10;
}
答案 3 :(得分:0)
if (card_name[0] == 'K' || 'Q' || 'J' )
应该是
if (card_name[0] == 'K' || card_name[0] == 'Q' || card_name[0] == 'J' )
'Q'
将始终评估为true,您需要在每个或中进行完整比较。
答案 4 :(得分:0)
检查if语句中的运算符优先级。如果你看这里 http://en.cppreference.com/w/c/language/operator_precedence ,你可以看到,= =的优先级高于||。
正确的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' || 'Q' || 'J' )
被理解为if(card_name[0] == 'K' || true || true)
,这始终是真的
答案 5 :(得分:0)
不,正如许多其他人所指出的,使用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;
}
请注意,switch
语句不是C中if
- else if
的通用替代,因为每个case
都需要是常量整数表达(粗俗地表达,C书会正确地告诉你这些限制)。
答案 6 :(得分:-1)
始终牢记||
意味着其中一个条件必须为真才能继续。如果使用&&
,它会检查所有条件,并且仅在所有条件满足时才进行。非常基本的信息...