最佳答案
能运行,因为运算有效;
但是结果不同吧?
if(c>31||b==4&&c>30) ……
//即 if((c>31)||((b==4)&&(c>30)));
//系统最终会判断或运算||的真假;
if(c>31|b==4&c>30)……
//即 if(((c>31)|b)==(4&(c>30)));
//系统最终会判断==左右两边是否匹配;
明显或运算||的判定范围要远大于==的真假判定,
运行结果不会一样、程序也完全是两种效果。追答:
&和|是位移运算,&&和||是逻辑运算,不同运算方法;具体的运算次序参见我加的()。
追问:
……printf("输入年、月、日:\n");A:scanf("%d%d%d",&a,&b,&c);if(b>12||c>31||(b==4||b==6||b==9||b==1)&&c>30){printf("日期输入错误,重新输入:\n");goto A;}……把&&和||改成&和|之后,输入错误日期都会返回,运行结果还是和原先一样。
追答:
因为你的判断基数都是0和1(),&&和&的效果一样的,除非1&&1或者1&1否则都等于0;||和|的效果也是一样,除非0||0或者0&0否则都等于1;所以基于1和0的按位与、或,和逻辑与、或是等效的。你的判断式先用>、
追答:
关于提问:为什么c语言里把if(c>31||b==4&&c>30)改成if(c>31|b==4&c>30)仍然能正常运行?正确的解答是:因为先有“”和“==”将基值局限在0或1,所以将“||”和“&&”改为“|”和“&”仍能正常运行。
最佳答案由网友 jariii 提供