【问题标题】:why still goes inside else if?else if 为什么还要进去?
【发布时间】:2019-05-12 19:20:05
【问题描述】:

我真的被这个问题困了好几天了..

下面的程序是一个更大程序的一部分,它要求用户输入一张卡片,例如。 2d 代表(2 颗钻石)。我的问题出在函数“rank”中,我向它发送了一个字符串指针,使用 sscanf 它会找出用户输入的数字和字符。假设用户输入了 2d,程序继续进入这个(否则 if(suit1 != 'c' || suit1 != 'd' || suit1 != 'h' || suit1 != 's') 我真的不明白为什么,请帮忙?

#include <stdio.h>
#include <stdlib.h>

void rank (const char *s);

int main(){

    char text [20];

    printf("enter 2d");
    fgets(text, 4, stdin);

    rank(text);

    return 0;
}

void rank ( const char *s) {

    int num;
    char suit1;

    if((sscanf(s,"%d %c", &num , &suit1 )) == 2 ){

        if(num == 0 || num == 1){
            printf("bad rank 0 or 1");
            return 0;
        }
        else if(suit1 != 'c' || suit1 != 'd' || suit1 != 'h' || suit1 != 's'){
           printf("Bad suit1!\n");
           return 0;
        }
        else
            printf("ok");
    }
}

【问题讨论】:

    标签: char scanf


    【解决方案1】:

    else if 的条件将始终评估为 true

    suit1 != 'c' || suit1 != 'd' || suit1 != 'h' || suit1 != 's'
    


    解决方案

    else if 中的正确条件类似于

    !(suit1 == 'c' || suit1 == 'd' || suit1 == 'h' || suit1 == 's') // Using OR
    suit1 != 'c' && suit1 != 'd' && suit1 != 'h' && suit1 != 's'    // Using AND
    


    打破它

    让我们将您的表达式分解为单个条件:

    suit1 != 'c' // Suit1 is not 'c'
    suit1 != 'd' // Suit1 is not 'd'
    suit1 != 'h' // Suit1 is not 'h'
    suit1 != 's' // Suit1 is not 's'
    

    如您所见,您的代码首先检查 suit1 是否不是 'c'。有两种可能:

    • Suit1 不是 'c' => 表达式返回 true
    • Suit1'c' => 程序继续并检查 Suit1 是否是 'd'。只有当Suit1'c' 时,程序才会到达这一点。由于'c' != 'd' 条件为true,您的程序将始终执行else if 块中的代码。


    重写条件

    您可以将表达式更改为使用 and &amp;&amp; 而不是 or || 并反转整个内容。

    !(suit1 == 'c' && suit1 == 'd' && suit1 == 'h' && suit1 == 's')
    

    使用这种语法,您可以清楚地看到suit1 不可能同时拥有所有这些值。

    【讨论】:

    • 非常感谢 Felix 的回复。我写的代码如下:else if (!(suit1 == 'c' &amp;&amp; suit1 == 'd' &amp;&amp; suit1 == 'h' &amp;&amp; suit1 == 's')) 如你所说,或者我的回答错了?但这对我没有用。但后来我改为以下内容:else if(suit1 != 'c' &amp;&amp; suit1 != 'd' &amp;&amp; suit1 != 'h' &amp;&amp; suit1 != 's') 现在可以正常工作了。
    • !(suit1 == 'c' &amp;&amp; suit1 == 'd' &amp;&amp; suit1 == 'h' &amp;&amp; suit1 == 's') 与您的原始条件相同,只是用逻辑&amp;&amp; 而不是|| 表示。我认为这可能更清楚地理解这永远无法评估为真。您使用的正确条件是我放在答案顶部的条件之一(正如您已经弄清楚的那样)。
    猜你喜欢
    • 2019-05-18
    • 2011-12-25
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 2018-09-19
    • 1970-01-01
    相关资源
    最近更新 更多