1

我不知道我的程序有什么问题。每当我尝试输出时,它只打印It is the season of Winter,我不知道如何解决这个问题。

int main() {
    int answer = 1;
    int mon;

    do {
        printf("Input a month : ");
        scanf("%d", &mon);

        if (mon == 1 || 2 || 12)
            printf("It is the season of winter\n\n\n");
        
        if (mon == 3 || 4 || 5) 
            printf("It is the season of spring\n\n\n");
        
        if (mon == 6 || 7 || 8)
            printf("It is the season of summer\n\n\n");
        
        if (mon == 9 || 10 || 11)
            printf("It is the season of fall\n\n\n");
        
        printf("Would you like to try again? (1= YES / 0= NO) : ");
        scanf("%d", &answer);
    
    } while (answer !=0);
    
    printf("\n\n\n");
}
4

2 回答 2

4

if 语句中的条件不正确。

例如,让我们考虑这个 if 语句

if (mon == 1 || 2 || 12)

它相当于

if ( ( mon == 1 ) || ( 2 ) || ( 12 ) )

因此,由于逻辑 OR 运算符的第二个和第三个操作数不等于 0,因此条件始终评估为逻辑真。

来自 C 标准(6.5.14 逻辑或运算符)

3 || 如果任一操作数比较不等于 0,则运算符应产生 1;否则,它产生 0。结果具有 int 类型。

你需要写

if (mon == 1 || mon == 2 || mon == 12)

此外,与其使用一系列 if 语句,不如编写 if -else if 语句,例如

    if (mon == 1 || mon == 2 || mon == 12)
        printf("It is the season of winter\n\n\n");
    
    else if (mon == 3 || mon == 4 || mon == 5) 
        printf("It is the season of spring\n\n\n");
    
    else if (mon == 6 || mon == 7 || mon == 8)
        printf("It is the season of summer\n\n\n");
    
    else if (mon == 9 || mon == 10 || mon == 11)
        printf("It is the season of fall\n\n\n");

在这种情况下,例如,如果第一个 if 语句的表达式的计算结果为 true,则将跳过所有其他 if 语句。也就是说,在这种情况下,您可以避免对 if 语句的表达式进行冗余评估。

于 2021-12-10T07:58:15.027 回答
0

问题中的代码应该打印所有四个季节,因为所有测试都评估为真:

if (mon == 1 || 2 || 12)

评估mon == 1仅在 1 月为真的第一个条件,然后在其他月份评估2非零,因此为真,因此整个条件为真并被It is the season of winter打印。所有四个测试都会发生同样的情况。

你应该这样写:

if (mon == 1 || mon == 2 || mon == 12)
于 2021-12-10T08:04:49.077 回答