套你猴子(甲鱼 发表于 2019-5-11 15:23:41

跪求这行代码什么意思呀,以前没见过

   d = 31-(m==4)+(m==6)+(m==9)+(m==11)(关于求每个月多少天的)
谢谢

Croper 发表于 2019-5-11 15:44:22

首先,这句代码写错了,少了个括号
正确的应该是:
d = 31-((m==4)+(m==6)+(m==9)+(m==11));

然后解释
m==4:
当m为4时,返回1,其他情况返回0。

所以整个语句就是:
m为4,6,9,11时,d就等于31-(1+0+0+0)=30
其他情况为31天

套你猴子(甲鱼 发表于 2019-5-11 15:46:08

哦,谢谢啦,你这么一说,我瞬间就明白啦,非常感谢

jackz007 发表于 2019-5-11 15:59:20

本帖最后由 jackz007 于 2019-5-11 17:37 编辑

       把逻辑值当成整型数来使用,逻辑假取值 0,逻辑真取值 1,于是就构成了计算每个月份天数的表达式。但是,这个表达式带有很大的不确定性,逻辑假取值 0 这个没有问题,逻辑真的取值就不那么确定了,只要是非 0 就都是真,具体取值和编译器有关系。

    m = 1 :
    m == 4   取值:0
    m == 6   取值:0
    m == 9   取值:0
    m == 11    取值:0
    d = 31-(m==4)+(m==6)+(m==9)+(m==11) = 31

    m = 4 :
    m == 4   取值:1
    m == 6   取值:0
    m == 9   取值:0
    m == 11    取值:0
    d = 31-(m==4)+(m==6)+(m==9)+(m==11) = 30

    m = 8 :
    m == 4   取值:0
    m == 6   取值:0
    m == 9   取值:0
    m == 11    取值:0
    d = 31-(m==4)+(m==6)+(m==9)+(m==11) = 31

    m = 11 :
    m == 4   取值:0
    m == 6   取值:0
    m == 9   取值:0
    m == 11    取值:1
    d = 31-(m==4)+(m==6)+(m==9)+(m==11) = 30      

套你猴子(甲鱼 发表于 2019-5-11 16:39:24

jackz007 发表于 2019-5-11 15:59
把逻辑值当成整型数来使用,逻辑假取值 0,逻辑真取值 1,于是就构成了计算每个月份天数的表达式。 ...

额,这。。这个是为啥呢,我用VC++6.0可以呀,一般不都是逻辑真为1,逻辑假为0嘛?

套你猴子(甲鱼 发表于 2019-5-11 16:40:38

Croper 发表于 2019-5-11 15:44
首先,这句代码写错了,少了个括号
正确的应该是:



下面有一位大佬提出了以前不同的观念,请您看看呗{:5_109:}

Croper 发表于 2019-5-11 16:42:28

本帖最后由 Croper 于 2019-5-11 16:48 编辑

jackz007 发表于 2019-5-11 15:59
把逻辑值当成整型数来使用,逻辑假取值 0,逻辑真取值 1,于是就构成了计算每个月份天数的表达式。 ...

同学。。。之所以出现32是因为原表达式少了个括号。。。。我在上面已经说了。。。

而且,关系表达式的结果一定为1或者0,不会出现其他的值;
总之,关系运算符被用来构成关系表达式。关系表达式在为真时值为 1, 为假时值为 0 。通常使用关系表达式作为判断条件的语句(例如 while 和 if)可以使用任何表达式作为判断,非零值被认为是“真”,而零值被认为是 “假”。(C primer plus,第五版,第六章,3.3)

不然你把这个括号加上试试:#include <stdio.h>

int main(void)
{
      int m                                                                                 ;
      for(m = 1 ; m < 13 ; m ++) printf("%2d : %d\n" , m , 31-((m==4)+(m==6)+(m==9)+(m==11))) ;
      printf("\n")                                                                        ;
}

jackz007 发表于 2019-5-11 17:13:05

本帖最后由 jackz007 于 2019-5-11 17:19 编辑

Croper 发表于 2019-5-11 16:42
同学。。。之所以出现32是因为原表达式少了个括号。。。。我在上面已经说了。。。

而且,关系表达式 ...

   看来,确实有问题,问题出在运算符不一致,后面的 3 个加号应该统一改成减号
d = 31-(m==4)+(m==6)+(m==9)+(m==11)
   这样就没有问题了:
d = 31-(m==4)-(m==6)-(m==9)-(m==11)

套你猴子(甲鱼 发表于 2019-5-11 17:37:46

Croper 发表于 2019-5-11 15:44
首先,这句代码写错了,少了个括号
正确的应该是:



哦哦,尴尬,谢谢哈,

jackz007 发表于 2019-5-11 17:45:10

本帖最后由 jackz007 于 2019-5-11 18:07 编辑

      楼主的代码有错误,进行修正,同时增加解决 2 月份及闰年的问题,楼主可以测试一下。
#include <stdio.h>

int main(void)
{
      int y , m , d                                                                                          ;

      printf("请输入一个年份: ")                                                                              ;
      scanf("%d" , & y)                                                                                    ;
      for(m = 1 ; m < 13 ; m ++) {
                d = 31-(m==2)*3-(m==4 || m==6 || m==9 || m==11)+(m==2)*(! (y % 4) && (y % 100 || ! (y % 400))) ;
                printf("%2d : %d\n" , m , d)                                                                   ;
      }
      printf("\n")                                                                                           ;
}

jackz007 发表于 2019-5-11 18:11:22

Croper 发表于 2019-5-11 16:42
同学。。。之所以出现32是因为原表达式少了个括号。。。。我在上面已经说了。。。

而且,关系表达式 ...

    粗心,没有发现暗藏的问题。谢谢指正!

老笨啊 发表于 2019-5-11 18:25:50

佩服007,关键不只是热心,还能想出更为合理正确的方式来解决问题。。
而不是单纯地解决当下的问题。。

套你猴子(甲鱼 发表于 2019-5-11 18:33:48

老笨啊 发表于 2019-5-11 18:25
佩服007,关键不只是热心,还能想出更为合理正确的方式来解决问题。。
而不是单纯地解决当下的问题。。

谢谢他们!!!

套你猴子(甲鱼 发表于 2019-5-12 08:10:33

jackz007 发表于 2019-5-11 17:45
楼主的代码有错误,进行修正,同时增加解决 2 月份及闰年的问题,楼主可以测试一下。

你们是用什么打印然程序然后上传的,我好像不能上传截图图片,说一下这道题思路,首先判断输入的年份是否是闰年赋值给一个变量f,逻辑真为1,假为0.
f==1?printf("%d是闰年",year):printf(“%d不是闰年",year”);
然后2月单独考虑,
if(m==2) days=28+f;
接下来就是我刚开始求助的程序(记得加大括号)。

jackz007 发表于 2019-5-12 09:32:43

套你猴子(甲鱼 发表于 2019-5-12 08:10
你们是用什么打印然程序然后上传的,我好像不能上传截图图片,说一下这道题思路,首先判断输入的年份是 ...

       你想知道什么,说清楚一点!

套你猴子(甲鱼 发表于 2019-5-12 10:30:20

jackz007 发表于 2019-5-12 09:32
你想知道什么,说清楚一点!

你们的回答里的程序使用什么编辑的,我还可以复制的,我本来想通过截图上传程序的,然后发现我没有权限
{:5_109:}

jackz007 发表于 2019-5-12 10:50:19

套你猴子(甲鱼 发表于 2019-5-12 10:30
你们的回答里的程序使用什么编辑的,我还可以复制的,我本来想通过截图上传程序的,然后发现我没有权限
...

      编辑器使用的是 Windows 记事本,编译器用的是 TDM-GCC,最好的一款 GNU C/C++ 编译器。

套你猴子(甲鱼 发表于 2019-5-12 11:43:35

jackz007 发表于 2019-5-12 10:50
编辑器使用的是 Windows 记事本,编译器用的是 TDM-GCC,最好的一款 GNU C/C++ 编译器。

谢谢
页: [1]
查看完整版本: 跪求这行代码什么意思呀,以前没见过