main(){printf(\"请输入年份:\"); int a,k;
scanf(\"%d\
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语言的人最容易犯的错误集锦(三)
从键盘输入一个数字保存到int中: int i; scanf(\"%i\
这段代码有错吗?看起来好像没错,也可以编译通过,但是运行的时候我们输入要设置的字符会造成“程序内存访问冲突”之类的程序错误。为什么呢?
注意scanf第二个参数是待设置变量的指针,而不是变量的值,比如要将用户输入的数字保存到变量i中的话要使用 scanf(\"%s\,而不是scanf(\"%s\,这也不需要强行记忆,因为所有需要“设置变量”的地方都要传递变量的地址,而所有需要“读取变量”的地方都要传递变量的名字。 修正后的代码如下: int i;
scanf(\"%i\
初学C语言的人最容易犯的错误集锦(四)
曾经有同学在如鹏网的官方QQ群中提了下面的问题: printf(\"%c%c\输入 \"ab <回车>\" 为什么显示为 b a?
这个问题比较复杂,要理解的话首先要理解函数调用中的“参数列表求值顺序”的概念。这个概念是所有编程语言都会涉及到的问题,并不局限于C语言,这也是一个“一通百通”的知识点,需要深刻理解。 假设有下面的一个函数f1: void f1(int i1,int i2,int i3) {
printf(\"i1=%d,i2=%d,i3=%d\}
在调用函数的时候,如果给函数传递的是普通的变量那么并不会体会到“参数列表求值顺序”的概念,比如代码段“f1(a,b,c)”的含义是“调用f1函数,并且给f1函数的参数1、参数2、参数3分别赋值为a、b、c三个变量”。那么如果是下面的代码呢: int i=10; f1(i++,i++,i++);
很多同学都认为上边的代码会打印出“i1=10,i2=11,i3=12”,但是运行以后你会发现与预想的完全相反:“i1=12,i2=11,i3=10”。这是和函数参数计算顺序(准确的讲应该叫“函数参数压栈顺序”)相关的,通俗的讲就是如果函数的参数不是简单的变量或者常量,而是需要进行计算的表达式、函数的时候,是按照从左到右还是从右到左的顺序计算函数的参数,C/C++的默认函数参数计算顺序是从右到左,也就是说对于“f1(i++,i++,i++)”来说会首先计算第三个参数、再计算第二个参数、再计算第一个参数,因此三个参数的值将会是“12、11、10”,这就不难解释貌似奇怪的执行结果了。
明白了这个道理,对于本文开始的例子出现的怪异行为也就不会奇怪了,因为输入的a被做为第二个getchar的返回值,b则被做为第一个getchar的返回值。
其实C/C++标准并没有规定函数参数计算顺序,不过主流的编译器都是从右至左的顺序。 关于这个问题可以参考更多资料: