初学C语言的人最容易犯的错误集锦(二)
2009-05-28 11:51
281 查看
下面的代码用来判断用户输入的年份是否是闰年:
#include <stdio.h>
main()
{printf("请输入年份:");
int a,k;
scanf("%d",&a);
k=(a%4==0&&a%100!=0)||(a%4==0&&a%400==0);
if(k=0)
printf("不是闰年");
if(k=1)
printf("是闰年");
system("pause");
}
能看出程序有什么问题吗?为什么无论输入什么都显示“是闰年”?
很明显,程序中判断k是否等于0或者等于1的时候错误的使用了“=”进行值的相等判断而不是“==”。在C语言中“k=1”不仅是“把k变量赋值为1”,而且如果把“k=1”当作表达式的话“k=1”还会有返回值,它的值就等于k赋值以后的值。
=====================================================
如果还不明白的话跟着我来看一个例子,试验代码如下:
int i=3;
printf("%d/n",i==5);
printf("%d/n",i=5);
上面的代码执行结果如下:
0
5
我们来分析一下上面代码,第二行是打印“i==5”的值,由于i=3,所以i等于5,而C语言中“不等于”的值是0,所以第一行打印0;第三行是首先执行表达式“i=5”的值,这个表达式首先将i赋值为5,然后“i=5”也是有返回值的,它的返回值就是变量i的值,所以第三行会打印出5。
===========================================================
“k=1”的值为k的值,而k等于1,所以“k=1”的值就是1,而1等于TRUE,所以
if(k=1)
printf("是闰年");
就永远都会执行了。
同样“k=0”的值为k的值,而k等于0,所以“k=0”的值就是0,而1等于FALSE,所以
if(k=0)
printf("不是闰年");
就永远都不会得到执行了。
明白了这个道理,我们以后在if语句等地方使用“==”的时候千万不要误写成“=”,可是“人有失手,马有乱踢”,我们总会不经意的犯这样的错误,而且这样的错误很难查找,那么能不能从根本上防范这种错误呢?有经验的C/C++开发人员编写类似于上面判断闰年的代码的时候一般会这么写:
#include <stdio.h>
main()
{printf("请输入年份:");
int a,k;
scanf("%d",&a);
k=(a%4==0&&a%100!=0)||(a%4==0&&a%400==0);
if(0==k)
printf("不是闰年");
if(1==k)
printf("是闰年");
system("pause");
}
看出差别来了吗???好像没啥差别呀?仔细看:
if(0==k)
printf("不是闰年");
这里将“k==0”颠倒成了“0==k”,这有什么用吗?请上眼!比如编程的时候我将“==”误写成“=”有什么后果呢?
if(0=k)
printf("不是闰年");
编译的时候编译器会报告“if(0=k)”这行代码有错误,因为0是一个常量数字,不能设置它的值。
这样通过将待判断表达式的值放到变量之前的这样的方式就可以“打好预防针”,为防止失误起到了作用。
这种技巧是有经验的开发人员经常使用的,因此如鹏网的杨中科老师建议大家在开发过程中也培养起这样的习惯,而且等你毕业求职面试、笔试的时候,如果你写出这样的代码风格的话,考官一定会认为你是一个有经验的开发人员,这样的话你得到offer还不容易吗?
#include <stdio.h>
main()
{printf("请输入年份:");
int a,k;
scanf("%d",&a);
k=(a%4==0&&a%100!=0)||(a%4==0&&a%400==0);
if(k=0)
printf("不是闰年");
if(k=1)
printf("是闰年");
system("pause");
}
能看出程序有什么问题吗?为什么无论输入什么都显示“是闰年”?
很明显,程序中判断k是否等于0或者等于1的时候错误的使用了“=”进行值的相等判断而不是“==”。在C语言中“k=1”不仅是“把k变量赋值为1”,而且如果把“k=1”当作表达式的话“k=1”还会有返回值,它的值就等于k赋值以后的值。
=====================================================
如果还不明白的话跟着我来看一个例子,试验代码如下:
int i=3;
printf("%d/n",i==5);
printf("%d/n",i=5);
上面的代码执行结果如下:
0
5
我们来分析一下上面代码,第二行是打印“i==5”的值,由于i=3,所以i等于5,而C语言中“不等于”的值是0,所以第一行打印0;第三行是首先执行表达式“i=5”的值,这个表达式首先将i赋值为5,然后“i=5”也是有返回值的,它的返回值就是变量i的值,所以第三行会打印出5。
===========================================================
“k=1”的值为k的值,而k等于1,所以“k=1”的值就是1,而1等于TRUE,所以
if(k=1)
printf("是闰年");
就永远都会执行了。
同样“k=0”的值为k的值,而k等于0,所以“k=0”的值就是0,而1等于FALSE,所以
if(k=0)
printf("不是闰年");
就永远都不会得到执行了。
明白了这个道理,我们以后在if语句等地方使用“==”的时候千万不要误写成“=”,可是“人有失手,马有乱踢”,我们总会不经意的犯这样的错误,而且这样的错误很难查找,那么能不能从根本上防范这种错误呢?有经验的C/C++开发人员编写类似于上面判断闰年的代码的时候一般会这么写:
#include <stdio.h>
main()
{printf("请输入年份:");
int a,k;
scanf("%d",&a);
k=(a%4==0&&a%100!=0)||(a%4==0&&a%400==0);
if(0==k)
printf("不是闰年");
if(1==k)
printf("是闰年");
system("pause");
}
看出差别来了吗???好像没啥差别呀?仔细看:
if(0==k)
printf("不是闰年");
这里将“k==0”颠倒成了“0==k”,这有什么用吗?请上眼!比如编程的时候我将“==”误写成“=”有什么后果呢?
if(0=k)
printf("不是闰年");
编译的时候编译器会报告“if(0=k)”这行代码有错误,因为0是一个常量数字,不能设置它的值。
这样通过将待判断表达式的值放到变量之前的这样的方式就可以“打好预防针”,为防止失误起到了作用。
这种技巧是有经验的开发人员经常使用的,因此如鹏网的杨中科老师建议大家在开发过程中也培养起这样的习惯,而且等你毕业求职面试、笔试的时候,如果你写出这样的代码风格的话,考官一定会认为你是一个有经验的开发人员,这样的话你得到offer还不容易吗?
相关文章推荐
- 初学C语言的人最容易犯的错误集锦(一)
- 初学C语言的人最容易犯的错误集锦(三)
- 初学C语言编程时最容易犯的错误,你踩坑了吗?
- 初学C语言时在语法和语义上容易犯的一些错误
- c语言初学错误
- C语言错误集锦
- python初学的各种错误集锦
- 常见C语言错误集锦
- c语言编程常见错误集锦
- C语言初学者最容易犯的错误
- C语言错误集锦
- 初学c语言常见错误
- ffmpeg 初学错误集锦
- C语言常见的内存错误总结
- (转)Hadoop之常见错误集锦
- C语言中的一些容易出现错误的知识点
- [初学hadoop]错误信息:hdfs://192.168.0.16:9000/report.bak, expected: file:///
- XCode编译警告和错误解决方法集锦
- 程序员容易忽略的SQL Server错误集锦
- c语言中最容易弄错的两个概念碰头了