C 如果语句条件未满足,但程序被卡住

C 如果语句条件未满足,但程序被卡住,c,cs50,C,Cs50,基本上,条件未满足,但程序不会从主if语句进入else语句。我将给出它的要点,一个tl;dr版本在前面,完整版本在下面 tl;dr版本: a = 1; b = 2; c = 3; if(a == 1) { if(b == 1 && c == 1) do x; if(b == 2 && c == 2) do y; if(b == 3 && c == 3) do z; } else printf(&

基本上,条件未满足,但程序不会从主if语句进入else语句。我将给出它的要点,一个tl;dr版本在前面,完整版本在下面

tl;dr版本:

a = 1;
b = 2;
c = 3;

if(a == 1)
{
    if(b == 1 && c == 1)
    do x;

    if(b == 2 && c == 2)
    do y;

    if(b == 3 && c == 3)
    do z;
}
else
printf("Invalid\n");
基本上,所有较小的if语句条件都不满足,程序应该继续执行else语句并打印“Invalid”,但它不会。它什么也不做。有关实际程序,请参见:

#include <cs50.h>
#include <stdio.h>

int checksum = 10;
int j = 16;
long first = 5;
long second = 6;

int main(void)
{
    checksum %= 10;
    if(checksum == 0)
    {
        if(j == 15 && first == 3 && (second == 4 || second == 7))
        printf("AMEX\n");

        if(j == 16 && first == 5 && (second == 1 || second == 2 || second == 3 || second == 4 || second == 5))
        printf("MASTERCARD\n");

        if((j == 16 || j == 13) && first == 4)
        printf("VISA\n");
    }
    else
    printf("INVALID\n");
}
#包括
#包括
整数校验和=10;
int j=16;
长首=5;
长秒=6;
内部主(空)
{
校验和%=10;
如果(校验和=0)
{
如果(j==15&&first==3&&second==4 | | second==7))
printf(“美国运通”);
如果(j==16&&first==5&&(second==1 | second==2 | second==3 | second==4 | second==5))
printf(“万事达卡”);
如果((j==16 | | j==13)和&first==4)
printf(“VISA卡”);
}
其他的
printf(“无效\n”);
}
只有当不满足较大的if语句时,程序才会打印“INVALID”。您需要通过添加另一个与较小的if语句条件关联的else来更改代码,如下所示:

#include <cs50.h>    
#include <stdio.h>
    
    int checksum = 10;
    int j = 16;
    long first = 5;
    long second = 6;
    
    int main(void)
    {
        checksum %= 10;
        if(checksum == 0)
        {
            if(j == 15 && first == 3 && (second == 4 || second == 7))
                printf("AMEX\n");
    
            else if(j == 16 && first == 5 && (second == 1 || second == 2 || second == 3 || second == 4 || second == 5))
                printf("MASTERCARD\n");
    
            else if((j == 16 || j == 13) && first == 4)
                printf("VISA\n");
    
            else printf("INVALID\n");
        }
        else
            printf("INVALID\n");
    }
#包括
#包括
整数校验和=10;
int j=16;
长首=5;
长秒=6;
内部主(空)
{
校验和%=10;
如果(校验和=0)
{
如果(j==15&&first==3&&second==4 | | second==7))
printf(“美国运通”);
如果(j==16&&first==5&&second==1 | | | second==2 | | second==3 | | second==4 | | second==5))
printf(“万事达卡”);
else如果((j==16 | | j==13)和&first==4)
printf(“VISA卡”);
else printf(“无效\n”);
}
其他的
printf(“无效\n”);
}
希望能有所帮助

Giovanni Pachera

如果您希望“让代码看起来更干净”,您可以使用一种称为“提前退出”的编程模式。基本思想是,对于每个“正确”的答案,您都返回值。由于您还没有使用函数,您的程序将不得不提前退出;但是,通常情况下,函数返回“正确”值,而不是程序在成功/失败时返回的值

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

int checksum = 10;
int j = 16;
long first = 5;
long second = 6;

int main(void) {
    checksum %= 10;
    if(checksum == 0 && j == 15 && first = 3 && (second == 4 || second == 7) {
        printf("AMEX\n");
        return EXIT_SUCCESS;
    }
    if (checksum == 0 && j == 16 && first == 5 && (second == 1 || second == 2 || second == 3 || second == 4 || second == 5))
        printf("MASTERCARD\n");
        return EXIT_SUCCESS;
    }
    if (checksum == 0 && (j == 16 || j == 13) && first == 4)
        printf("VISA\n");
        return EXIT_SUCCESS;
    }
    printf("INVALID\n");
    return EXIT_FAILURE;
}
#包括
#包括
#包括
整数校验和=10;
int j=16;
长首=5;
长秒=6;
内部主(空){
校验和%=10;
如果(校验和=0&&j==15&&first=3&&(秒==4 | |秒==7){
printf(“美国运通”);
返回退出成功;
}
如果(校验和=0&&j==16&&first==5&&second==1 | | second==2 | | second==3 | | second==4 | | second==5))
printf(“万事达卡”);
返回退出成功;
}
如果(校验和=0&(j==16 | | j==13)&&first==4)
printf(“VISA卡”);
返回退出成功;
}
printf(“无效\n”);
返回退出失败;
}
int main(void){
中的
int
是程序的返回码。它被发送回终端,这样人们就可以判断程序是否正确运行或遇到错误。
EXIT\u SUCCESS
EXIT\u FAILURE
是C常量,在(我认为
中定义)


也要考虑使用<代码> int main(int ARC,char *ARGV)<代码> >代码> int main(空格)的习惯。即使您不立即使用参数,这也是一种键入

main
函数的方法,您永远不必更新该函数。

else
仅与条件为true的最外面的
if
相关。
else
与单个
if
语句相关:这里是
if(a==1)
,而不是任何其他
if
语句。您需要
else if
。查看您最喜欢的C编程书。您应该正确缩进代码,另一种方法是“提前退出”如果有一个代码块可以返回多个值中的一个,则可以将每个
If
语句写入
return;
,然后避免使用许多
else-If
子句。它不会更改逻辑处理,但会使代码更容易添加或删除将来的返回值。“默认值”值在块的末尾返回。