逻辑运算符分析
1. 有趣问题:逻辑运算符&&,||和!真的很简单吗?
【实例分析】初探逻辑运算符
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
int k = 0;
//等价于(true && ++i) ||(++j && ++k)可见整个表达式为或运算,从左向右进行
//或运算,先计算或左边的(true && ++i)结果为true,根据“或”的短路规则,不再
//进行右边的(++j && ++k)。
++i || ++j && ++k;
printf("%d\n", i); //i为1
printf("%d\n", j); //0
printf("%d\n", k); /0
return 0;
}
2. 程序中的短路
(1)||从左向右开始计算
①当遇到为真的条件时停止运算,整个表达式为真
②所有条件为假时表达式才为假
(2)&&从左向右开始计算
①当遇到为假的条件时停止运算,整个表达式为假
②所有条件为真时表达式才为真
3. 逻辑表达式中,&&比||具有更高的优先级
▲ 在&&和||混合运算时,整个表达式被看作||表达式,编译器从左向右开始计算&&表达式,当某个&&表达式的值为真时,停止计算,整个表达式的值为真。
【实例分析】程序中的短路规则
#include <stdio.h>
int g = 0;
int f()
{
printf("In f()...\n");
return g++;
}
int main()
{
//等价(true && g) || (f() && f())
//或的左边为false,继续计算右边的(f() && ())
//所以先输出f中的printf语句,由于第1个f返加0
//而或右边的表达式是“与”运算,所以短路,即右
//则表达式返回false,整个表达式为false。下列的
//if语句中的printf不被执行。
if( g || f() && f() )
{
printf("In if statement: %d\n", g);
}
printf("In main(): %d\n", g);
return 0;
}
//输出结果
//In f()...
//In main(): 1
4. “!”究竟是神马
【实例分析】逻辑非运算符的使用
#include <stdio.h>
int main()
{
printf("%d\n", !0); //1
printf("%d\n", !1); //0
printf("%d\n", !100); //0
printf("%d\n", !-1000);//0
return 0;
}
▲C语言中的逻辑非“!”只认得0,只知道见了0就返回1。当碰见其它值时,返回0。
5. 三目运算符
(1)三目运算符(a?b:c)可以作为逻辑运算的载体
(2)规则:当a的值为真时,返回变量b的值(而不是变量本身);否则返回c的值。 (的值)
【实例分析】三目运算符初探
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 0;
c = a < b ? a : b; //(a<b)?a:b;
//以下代码试图根据条件有选择地给a或b变量赋值。但这样的
//代码是错的,因为三目运算符的返回值是a或b变量的值,
//而不是a或b变量本身,下列的代码相当于1=3;或2=3;
//即要把3赋值给1或2。编译器会报错。
//(a < b ? a : b) = 3; //error
//要达到上述目的,可以改为如下代码,因为三目返回的是变
//量a或b的地址,而不是变量a或b的值。
*(a < b ? &a:&b) = 3;
printf("a = %d\n", a); //3
printf("b = %d\n", b); //2
printf("c = %d\n", c); //1
return 0;
}
(3)三目运算符(a?b:c)的返回类型
①通过隐式类型转换规则返回b或c中较高的类型
②当b和c不能隐式转换到同一类型时将编译出错。
【实例分析】三目运算符的返回类型
#include <stdio.h>
int main()
{
char c = 0;
short s = 0;
int i = 0;
double d = 0;
char* p = "str";
printf("a = %d\n",sizeof(c?c:s)); //将char和short隐式转为int,结果为4
printf("b = %d\n", sizeof(i?i:d)); //将i隐式转换为double,结果为8
//printf("c = %d\n", sizeof(d?d:p)); //错误,因为指针不能与基本类型隐式转换
return 0;
}
6. 小结
(1)程序中的逻辑表达式遵循短路规则
(2)在&&与||混合运算时
①整个表达式被看作||表达式;②从左向右计算&&表达式;③最后计算||表达式
(3)逻辑非!运算符只认得0。碰见0返回1,否则统统返回0。(只有0才表示假,其余均为真)
(4)三目运算符返回变量的值,而不是变量本身
(5)三目运算符通过隐式类型转换规则确认返回值类型
浙公网安备 33010602011771号