初莫M 发表于 2023-10-1 13:48:56

为什么if语句后的所有语句都执行了啊

题目是
输入第一行按照hh:mm的格式给出当前时间。其中hh是小时,在00到23之间;mm是分钟,在00到59之间。

输出格式:
根据当前时间替大笨钟敲钟,即在一行中输出相应数量个Dang。如果不是敲钟期,则输出:

Only hh:mm.Too early to Dang.
其中hh:mm是输入的时间。#include <stdio.h>
int main()
{
        int h,m;
        scanf("%d:%d",&h,&m);
        if(h<12) printf("Only %d:%d.Too early to Dang.",h,m);
        if(h==12&&m==0) printf("Only %d:%d.Too early to Dang.",h,m);
        if((h=12&&m!=0)||(h==13&&m==0)) printf("Dang");
        if((h=13&&m!=0)||(h==14&&m==0)) printf("DangDang");
        if((h=14&&m!=0)||(h==15&&m==0)) printf("DangDangDang");
        if((h=15&&m!=0)||(h==16&&m==0)) printf("DangDangDangDang");
        if((h=16&&m!=0)||(h==17&&m==0)) printf("DangDangDangDangDang");
        if((h=17&&m!=0)||(h==18&&m==0)) printf("DangDangDangDangDangDang");
        if((h=18&&m!=0)||(h==19&&m==0)) printf("DangDangDangDangDangDangDang");
        if((h=19&&m!=0)||(h==20&&m==0)) printf("DangDangDangDangDangDangDangDang");
        if((h=20&&m!=0)||(h==21&&m==0)) printf("DangDangDangDangDangDangDangDangDang");
        if((h=21&&m!=0)||(h==22&&m==0)) printf("DangDangDangDangDangDangDangDangDangDang");
        if((h=22&&m!=0)||(h==23&&m==0)) printf("DangDangDangDangDangDangDangDangDangDangDang");
        if(h=23&&m!=0) printf("DangDangDangDangDangDangDangDangDangDangDangDang");
}

isdkz 发表于 2023-10-1 13:49:03

问题在于if语句后的判断条件使用了赋值操作符“=”,导致整个表达式的值都变成了赋值后的值,而不是判断条件。因此,所有的if语句都会执行,导致输出结果不符合预期。

正确的写法是使用比较操作符“==”来进行判断条件,如下所示:

#include <stdio.h>

int main()
{
    int h, m;
    scanf("%d:%d", &h, &m);
    if (h < 12)
      printf("Only %d:%d. Too early to Dang.", h, m);
    else
    {
      int cnt = h - 12;
      if (m > 0)
            cnt++;
      for (int i = 0; i < cnt; i++)
            printf("Dang");
    }
    return 0;
}


此代码中,我们使用了else语句来避免重复判断。同时,我们使用了一个计数器cnt来记录应该输出几个“Dang”,而不是使用多个if语句进行判断。

陶远航 发表于 2023-10-1 13:49:07

if语句后的所有语句都执行了,是因为这里使用了赋值运算符=而不是等于运算符==。在if语句中,应该使用等于运算符==来判断两个值是否相等。

例如,在下面的代码中,if语句应该使用等于运算符==:

if (h == 23 && m != 0) {
    printf("DangDangDangDangDangDangDangDangDangDangDangDang");
}


而不是赋值运算符=,如下所示:

if (h = 23 && m != 0) {
    printf("DangDangDangDangDangDangDangDangDangDangDangDang");
}


此外,还要注意每个if语句之间的关系。在这种情况下,应该使用if-else if结构,以确保只有一个条件被满足时才会执行相应的代码。例如:

if (h < 12 || (h == 12 && m == 0)) {
    printf("Only %02d:%02d. Too early to Dang.", h, m);
} else if (h >= 12 && m == 0) {
    for (int i = 0; i < h - 12; i++) {
      printf("Dang");
    }
}


以上代码中,第一个if语句用于判断时间是否早于12点,如果是,则输出“Too early to Dang.”。else if语句用于判断时间是否为整点,如果是,则根据小时数输出相应数量的“Dang”。如果都不是,则不会执行任何代码。

希望这可以帮助你解决问题。
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 2023-10-1 13:49:58

在给出的代码中,if语句后的所有语句都执行了的原因是因为在条件判断中使用了赋值运算符(=)而不是相等运算符(==)。在C/C++中,单个等号是赋值运算符,用于将右侧的值赋给左侧的变量。相等运算符是双等号(==),用于判断两个值是否相等。

下面是对代码进行修改后的正确版本:


#include <stdio.h>

int main() {
    int h, m;
    scanf("%d:%d", &h, &m);
   
    if (h < 12) {
      printf("Only %d:%d.Too early to Dang.", h, m);
    }
    else if (h == 12 && m == 0) {
      printf("Only %d:%d.Too early to Dang.", h, m);
    }
    else if ((h == 12 && m != 0) || (h == 13 && m == 0)) {
      printf("Dang");
    }
    else if ((h == 13 && m != 0) || (h == 14 && m == 0)) {
      printf("DangDang");
    }
    else if ((h == 14 && m != 0) || (h == 15 && m == 0)) {
      printf("DangDangDang");
    }
    // 继续添加其他时刻的判断条件和相应的输出
   
    return 0;
}


在修改后的代码中,我们使用了双等号(==)进行条件判断,确保只有符合条件的语句会被执行。同时,我们也添加了适当的分号和花括号,以确保代码逻辑的正确性。

希望这个回答能够解决你的问题。如果还有其他疑问,请随时提出。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 为什么if语句后的所有语句都执行了啊