1.关于==和=容易弄混淆。
==在计算机语言中表示的是等于,=在计算机中表达的是赋值。
若将==写成了=,则会导致逻辑错误,如下面的代码
int n = 0;
while (n = 1)//若n等于1,则在屏幕上显示yes
{
printf("yes!\n");
}
return 0;
可以看到,这个代码要实现的是判断n是否为1,若是打印yes,但是却出现了以下的现象
按照我们的逻辑,应该是不进入循环,main函数直接返回0,可是屏幕上却打印了yes,这是因为在=为赋值,循环判断条件中,1放进了n中,n由0变成了1,且在这之后均不断地被赋值为1,条件为永真,进入死循环。
由于编译器只解决语法错误,所以在上述情况下,编译器不会报错,当我们错写的时候,检查此项错误就不那么方便,为解决这一问题,我们可以这样写代码
int n = 0;
while (1 = n)
{
printf("yes!\n");
}
return 0;
这样编译器就会报错了
这样就方便我们查找此类错误了
改为这样,就符合我们的逻辑了
int n = 0;
while (1 == n)
{
printf("yes!\n");
}
return 0;
2.逻辑与(&&)或(||)的短路现象
运用 && 和 || 的时候,从左到右依次计算;&&操作符若左边的已经为假,则右边的表达式不执行,直接返回整个表达式的结果,以下面的代码为例
#include <stdio.h>//由于要运用到输出函数printf,所以要包含头文件
int main()
{
int a = 0, b = 0, c = 4;
int x = 0, y = 0;
int n = (x = a + b) && (y = b + c);//代码中所有的标点符号均要采用英文,否则会编译器会报错,无法运行程序
printf("x = %d y = %d n = %d", x, y, n);// n 用来放整个表达式的结果,逻辑运算与或非返回的值为1(真)或0(假)
return 0;//main函数运行结束后返回一个整型的值0,若该行代码正常结束则返回0
}
上面的结果,按照我们的逻辑应该是 x = 0, y = 4; 但是结果却是这样的
这是因为代码在执行的时候,从左到右依次计算,先将 a + b 的结果放入变量 x 中,左边的表达式为 0(假),则表达式 (x = a + b) && (y = b + c)就直接返回结果为0(假),放入变量n中。
同样的,|| 若左边的表达式为真,|| 右边的表达式不执行,直接返回结果,即1(真)
#include <stdio.h>
int main()
{
int a = 1, b = 0, c = 4;
int x = 0, y = 0;
int n = (y = b + c)||(x = a + b);
printf("x = %d y = %d n = %d", x, y, n);
return 0;
}
在该代码中,当左边的表达式为真(1)的情况下,整个表达式直接返回真(1),右边的表达式不执行,结果如下
变量 x 应该被 a + b的结果赋值,即 x = 1,但代码执行的结果却为 0 ,证明右边的表达式并没有执行,x 才会保持初值不发生改变。
综上,我们可以总结出,当运算符&&左边的表达式为假时,出现短路现象;而运算符 || 则相反左边表达式为假,出现短路现象。(&&找假,||找真)
3.三目操作符是可以接收三个操作对象,如“?:”
int x = 0, y = 4;//建立两个变量,分别存放 0 和 4
printf("%d", (x > y ? x : y));//该表达式表示当 x > y 表达式成立,则返回 x ,否则返回 y
在该代码中,x > y 、x 、y 分别是一个操作对象。
同样的,双目操作符(+、-、*(乘)、/(除)、>=、<=、==、>、<等)有两个操作对象,单目操作符(++、--、&(取地址符)等)有一个操作对象。