首页 > 解决方案 > 如果语句条件未满足但程序卡住

问题描述

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

tl;博士版本:

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 语句并打印“无效”,但它不会。它什么也不做。实际程序见:

#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");
}

标签: ccs50

解决方案


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

#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;
}

intinint main(void) {是程序的返回码。它被发送回终端,因此人们可以判断程序是否正确运行或遇到错误。 EXIT_SUCCESS并且EXIT_FAILURE是 C 常量,在(我认为<stdlib.h>)中定义。

另外,考虑养成使用int main(int argc, char* argv)over的习惯int main(void)。即使您不立即使用实参参数,它也是键入main函数的一种方法,您永远不必更新。


推荐阅读