我可以使用||而不是如果在C?

时间:2016-06-21 16:09:47

标签: c

我是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.我该怎么办?

7 个答案:

答案 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)

始终牢记||意味着其中一个条件必须为真才能继续。如果使用&&,它会检查所有条件,并且仅在所有条件满足时才进行。非常基本的信息...