跪求这行代码什么意思呀,以前没见过
d = 31-(m==4)+(m==6)+(m==9)+(m==11)(关于求每个月多少天的)谢谢 首先,这句代码写错了,少了个括号
正确的应该是:
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天 哦,谢谢啦,你这么一说,我瞬间就明白啦,非常感谢 本帖最后由 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 jackz007 发表于 2019-5-11 15:59
把逻辑值当成整型数来使用,逻辑假取值 0,逻辑真取值 1,于是就构成了计算每个月份天数的表达式。 ...
额,这。。这个是为啥呢,我用VC++6.0可以呀,一般不都是逻辑真为1,逻辑假为0嘛? Croper 发表于 2019-5-11 15:44
首先,这句代码写错了,少了个括号
正确的应该是:
下面有一位大佬提出了以前不同的观念,请您看看呗{:5_109:} 本帖最后由 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: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) Croper 发表于 2019-5-11 15:44
首先,这句代码写错了,少了个括号
正确的应该是:
哦哦,尴尬,谢谢哈, 本帖最后由 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") ;
}
Croper 发表于 2019-5-11 16:42
同学。。。之所以出现32是因为原表达式少了个括号。。。。我在上面已经说了。。。
而且,关系表达式 ...
粗心,没有发现暗藏的问题。谢谢指正! 佩服007,关键不只是热心,还能想出更为合理正确的方式来解决问题。。
而不是单纯地解决当下的问题。。 老笨啊 发表于 2019-5-11 18:25
佩服007,关键不只是热心,还能想出更为合理正确的方式来解决问题。。
而不是单纯地解决当下的问题。。
谢谢他们!!! 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;
接下来就是我刚开始求助的程序(记得加大括号)。 套你猴子(甲鱼 发表于 2019-5-12 08:10
你们是用什么打印然程序然后上传的,我好像不能上传截图图片,说一下这道题思路,首先判断输入的年份是 ...
你想知道什么,说清楚一点! jackz007 发表于 2019-5-12 09:32
你想知道什么,说清楚一点!
你们的回答里的程序使用什么编辑的,我还可以复制的,我本来想通过截图上传程序的,然后发现我没有权限
{:5_109:} 套你猴子(甲鱼 发表于 2019-5-12 10:30
你们的回答里的程序使用什么编辑的,我还可以复制的,我本来想通过截图上传程序的,然后发现我没有权限
...
编辑器使用的是 Windows 记事本,编译器用的是 TDM-GCC,最好的一款 GNU C/C++ 编译器。 jackz007 发表于 2019-5-12 10:50
编辑器使用的是 Windows 记事本,编译器用的是 TDM-GCC,最好的一款 GNU C/C++ 编译器。
谢谢
页:
[1]