为什么if(flag=1)执行了if()语句,if(flag==1)反而没有计算if()里的语句

le_iTAng 2018-12-01 05:37:25
#include <stdio.h>
int main()
{
int year=2018;
int month=8;
int day=8;
int sum ,flag;
switch(month)
{
case 1:
sum=31+334;
break ;
case 2:
sum=28+306;
break ;
case 3:
sum=31+275;
break ;
case 4:
sum=30+245;
break ;
case 5:
sum=31+214;
break ;
case 6:
sum=30+184;
break ;
case 7:
sum=153+31;
break ;
case 8:
sum=122+31;
break ;
case 9:
sum=92+30;
break ;
case 10:
sum=61+31;
break ;
case 11:
sum=31+30;
break;
case 12:
sum=31;
break;
}
sum=365-sum+day;
if(year%400==0 || (year%4==0 && year%100!=0))
{
flag=1;
}
else

flag=0;

if(flag==1 && month>2)
{
sum=sum+1;
}
printf("%d年%d月%d日是该年中的第%d天",year,month,day,sum);
return 0;
}

结果是,“flag=1”输出为221天,“flag==1”输出为220天
...全文
2667 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
优先级,=表赋值,==表关系
xiaoxiangqing 2018-12-05
  • 打赏
  • 举报
回复
flag==1才是判断语句,是不是flag不是整数
Hipevin 2018-12-04
  • 打赏
  • 举报
回复
“=”是赋值运算符,“==”是逻辑运算符
@风轻云淡_ 2018-12-03
  • 打赏
  • 举报
回复
if(flag=1 && ...) ==== if(1 && ...) 。日常写代码过程中,为避免发生类似错误,一般将常量放至左边 ----> if(1 == flag && ...)
英雄@末路 2018-12-03
  • 打赏
  • 举报
回复
在if判断前你flag 为0,如果是flag = 1, 这个是赋值语句,该语句返回TRUE,并且flag修改为1, 如果 flag == 1, 则进行判断,因为前面flag为0,所以返回FALSE,同事flag不改变。
AlbertS 2018-12-03
  • 打赏
  • 举报
回复
flag=1的表达式值为1,也就是表达式恒为真,没有起到判断的作用
自信男孩 2018-12-03
  • 打赏
  • 举报
回复
if (flag = 1)

这是一条赋值加判断语句,先将flag赋值为1,然后判断flag的真假,既然是1,那肯定是真,因此不论上面的结果flag为0,还是为1,sum = sum+1;是必执行的。
衍乾 2018-12-03
  • 打赏
  • 举报
回复
=是赋值,==是判断两边内容是否相等不能计算的
636f6c696e 2018-12-03
  • 打赏
  • 举报
回复
这种问题加几个printf就能自己搞懂,你问别人反而印象不深,时间长就忘了
weixin_41983149 2018-12-03
  • 打赏
  • 举报
回复
flag=1是个赋值语句。。。
weixin_43794582 2018-12-03
  • 打赏
  • 举报
回复
引用 13 楼 weixin_43794582的回复:
额,看来我们大学老师确实教的好。
非计算机专业只学c,就知道在c里,非零即一
weixin_43794582 2018-12-03
  • 打赏
  • 举报
回复
额,看来我们大学老师确实教的好。
打杂的9527 2018-12-03
  • 打赏
  • 举报
回复

一直以为优先级&&和||优先级最低了,没想到=这些赋值操作更低
所以更正一下
if (flag = 1 && month > 2)

等值于
if (flag = (1 && month > 2))

等值于
flag = (1 && month > 2);
if (flag)

还是判断flag是否为0
打杂的9527 2018-12-03
  • 打赏
  • 举报
回复
首先:2018年不是闰年,所以
if(year%400==0 || (year%4==0 && year%100!=0))
{
flag=1;
}
else
flag=0;

明显可以知道flag的值为0
接着:
if (flag == 1 && month > 2)

flag明显不等于1,所以判断通不过,结果不+1
至于:
if (flag = 1 && month > 2)

这样写的话flag = 1是一个赋值操作,可以等价于
flag = 1;
if(flag)

只要flag的值不为0,if语句都能通过
还有:
操作符&&或者||之类的必然是最后执行的,所以关优先级屁事
优先级高的操作符是&和|,不是&&和||
斗 鹰 2018-12-03
  • 打赏
  • 举报
回复
优先级,,还有==与=意义不一样,优先级也不一样。多试几遍就理解了。
xiehao315 2018-12-03
  • 打赏
  • 举报
回复
C没有布尔类型,所以一般会使用整数标识,0为假,1为真(实际只要是非0都是真)。
int flag; //判断标识,0为假,1为真
if(flag) 这种写法更简洁,当flag为1时才执行,flag为0时不执行,这样可以避免赋值=和判断符号==混用。
if(flag)等价于if(flag == 1)的情况,这里假定了flag要么是0,要么是1的情况
为了避免=和==混用,可以将if(flag == 1)改写为if(1 == flag) 这样如果将==写成=,编译器会直接报错
另外,if(flag = 1)的执行顺序是,先flag = 1;再if(flag);
关于&&,搞清楚基本用法,1&&1=1,1&&0=0,0&&1=0;0&&0=0。这里的1可以是数字,也可以是表达式,最好用(表达式);

关于你的疑惑,你可以判断添加printf()语句查看。
if(flag = 1){} printf("%d\n", flag);
if(flag == 1){} printf("%d\n", flag);

在此之前,你可以将flag分别赋值为0或1。

我个人比较倾向于if(flag)类型语句。 if(flag1 && flag2) if((flag1 || flag2) && (flag3 || flag4)) 类似的条件判断
土豆丝炒人 2018-12-02
  • 打赏
  • 举报
回复
应该就是楼上所说的优先级问题
! > 算术运算符 > 关系运算。&符 > && > || > 赋值运算符
如果是flag=1的话,他会先看“1&&month>2”结果是1“真”,然后再把1(真)赋值给flag,所以之前一步的flag是1或0都没有用了,只要二月以后就都会+1,楼主可以输出flag的值看看变化
water-moon 2018-12-01
  • 打赏
  • 举报
回复
优先级问题,&&两边加括号
永远的追梦人 2018-12-01
  • 打赏
  • 举报
回复
flag=1这个表达式的值为1

70,021

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧