哈喽,我又来啦,在前面的学习中,我们遇到过很多的操作符,那么每一个操作符都有自己意义,那么今天我们就来了解下吧!(内容有点多哦,加油学!)
首先,操作符大致可分为这几类:算术操作符,位移操作符,位操作符,赋值操作符,单目操作符 ,关系操作符,逻辑操作符,条件操作符,逗号操作符等等,那我们来一个一个了解
算数操作符
算数操作符:+ - * / %(取模)
案例:
int main()
{
int a = 5 / 2;
printf("%d\n", a);
int b = 5 % 2;
printf("%d\n", b);
printf("%d\n",11 % 5);
printf("%d\n",-11 % -5);
printf("%d\n",-11 % 5);
return 0;
}
注意:如果除号两边都是定义的整数,那么输出的结果也是整数,如果有浮点数,那么输出的结果就是浮点数,例如:7/2.0f, 此时%f输出的结果会是3.50000,记住让数值变为浮点数一定要加f;另外取模操作符只能用于整型,不能用于浮点数 |
移位操作符
移位操作符:<<左移操作符,>>右移操作符,移动的是二进制位
案例:
int main()
{
int a = 1;
int b = a << 1;
int c = a << 2;
printf("%d\n", b);
printf("%d\n", c);
return 0;
}
int a = 1:定义一个常量为1的整型a,因为一个整型占用4个字节,也就是32bit位,所以化成二进制就是 00000000000000000000000000000001,结果为1 int b = a << 1:定义一个整型变量b,并赋予值a<<1,意思是将a的二进制位向左移动一位,那么此时二进制为 00000000000000000000000000000010,结果为b=2(十进制) int c = a << 2:定义一个整型变量c,并赋予值a<<2,意思是将a的二进制位向左移动两位,那么此时二进制为 00000000000000000000000000000100,结果为c=4(十进制) 注意:a的值仍然不改变,依旧是1,改变的b,c的值,右移操作符同理 |
位操作符
位操作符:& 与运算 、| 或运算、^异或运算
& 与运算:同为1(真),则为真,否者为0(假),既有房又有车
| 或运算:有1(真)则真,全为0(假)位0(假),房、车有一即可
^异或运算:相同为0(假),不同位1(真)
注意:位操作符是要转化为二进制进行运算的!
案例:
int main()
{
int a = 3;
int b = 5;
int c = a & b;
int d = a | b;
int e = a ^ b;
printf("%d\n", c);
printf("%d\n", d);
printf("%d\n", e);
return 0;
}
赋值操作符
赋值操作符:= += -= *= /= &= ^= |= >>= <<=
注意:和初始化区别,int a =10 这个等号是初始化,a=20,这里是赋值
补充:赋值支持连续赋值,从右向左以此赋值,例如:a=b=5+7
单目操作符
单目操作符、双目操作符、三目操作符:就是操作符有几个操作数,例如:a+b 其中+就属于双目操作符,因为它一前一后共有两操作数
单目操作符:
!
! 逻辑反操作符:是真取假,是假取真(仅限0)
案例:
int main()
{
int a = 10;
int b = 0;
printf("%d\n", !a);
printf("%d\n", !b);
return 0;
}
- 负 + 正
- 负值:取负
+ 正值:取正
案例:
int main()
{
int a = -2;
int b = -a;
int c = +2;
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}
&
&:取地址操作符
这一个在后面的指针会进行具体讲解……
Sizeof
Sizeof:操作数的类型长度(以字节为单位),计算的是变量/类型所占用空间的大小
案例:
int main()
{
int a = 10;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof a);
printf("%d\n",sizeof int);
return 0;
}
|
补充:在上面的案例中编译器可能会提示将%d改成%zd,那是因为szie_t这个类型是专门为sizeof提供的,而这个size_t值默认是unsigned int (无符号整型),所以才会有提示
案例2:
int main()
{
int x[10] = { 0 };
int y = 0;
printf("%d\n", sizeof(x));
y = sizeof(x) / sizeof(x[0]);
printf("y=%d\n", y);
return 0;
}
|
注意:sizeof计算终止符\n和空格,和strlen一样
~
~:对一个数的二进制按位取反,取反的是二进制,是0则1,是1则0
案例:
int main()
{
int a = 0;
int b = ~a;
printf("%d\n", b);
return 0;
}
|
--
--:分为前置、后置— 前置:先--后使用 ;后置:先使用,后—
案例:与下方++原理一样,只是—是相减,然后值不一样 a=9 b=10 x=9 y=9
++
++:分为前置、后置++ 前置:先++后使用 ;后置:先使用,后++
案例:
{
int a = 10;
int x = 10;
int b = a++;
int y = ++x;
printf("a=%d b=%d\n", a, b);
printf("x=%d y=%d\n", x, y);
return 0;
}
|
*
*:间接访问操作符(解引用操作符)
这一个在后面的指针会讲到
(类型)
(类型):括号里面放个类型:强制类型转换
案例:
int main()
{
int a = (int)3.14;
printf("%d\n", a);
return 0;
}
|
补充:EOF:end of file 文件结束标志 值是-1
关系操作符
关系操作符:> >= < <= !=(不相等) ==(相等)
注意:关系表达式的结果如果为真,通常为1
案例:容易做错误例子
int main()
{
int a = 3;
if (a = 4);
printf("666");
return 0;
}
注意:这里的if语句( )中是赋值不是判断,是将a赋值为4,那么此时a是位真,因为非0,故执行打印,为了避免将判断弄成赋值这种情况,一般将常量写在左边,变量写在右边就好了 |
还有另外一个需要避免的情况:关系操作符不宜连用
案例:
int main()
{
int a = 5;
int b = 5;
int c = 7;
if (a < c < b)
printf("xxxx");
else
printf("hhhh");
return 0;
}
|
如果为避免以上情况,我们可以这样写:
int main()
{
int a = 5;
int b = 5;
int c = 7;
if (a < c && c < b)
printf("xxxx");
else
printf("hhhh");
return 0;
}
if (a < c && c < b):在判断中间加上一个 && 而&&是与运算,同为真才为真,那么又因为c<b是为假的,那么这整个表达式都是假,那么就执行else了 |
逻辑操作符
逻辑操作符:&&逻辑与 ||逻辑或
注意:真-非0 假-0
&&
&&:逻辑与 同时为真则为真,否则为假
注意:与位操作符的区别,位操作符需要转化为二进制在进行判断,二逻辑操作符可直接判断,判断依据逻辑操作符注意哪一句话
案例:
int main()
{
int a = 3;
int b = 5;
int c = a && b;
printf("c=%d\n", c);
return 0;
}
|
||
||:逻辑或 只要有一个为真,就为真,否者为假
注意:与位操作符的区别,位操作符需要转化为二进制在进行判断,二逻辑操作符可直接判断,判断依据逻辑操作符注意哪一句话
案例:
int main()
{
int a = 3;
int b = 0;
int c = a || b;
printf("c=%d\n", c);
return 0;
}
|
短路
C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短 路”
如前⾯的代码: if (month >= 3 && month <= 5)
表达式中&& 的左操作数是 month >= 3 ,右操作数是 month <= 5 ,当左操作数 month >= 3 的 结果是0的时候,及时不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。 所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏
对于 || 操作符是怎么样呢?我们结合前⾯的代码:if (month == 12 || month == 1 || month == 2)
如果month == 12,则不⽤再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。 所以, || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数。 像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进⾏计算的运算称为短 路求值
条件操作符
例:exp1?exp2:exp3
解释:判断exp1的表达式为真或假,如果为真就执行exp2表达式,此时整个表达式的结果就是exp2表达式的结果,如果为假就整型exp3表达式,此时整个表达式的结果是exp3表达式的结果
注意:此函数是三目操作符,共三个操作数
案例:
int main()
{
int a = 10;
int b = 20;
int max = 0;
max = a > b ? a : b;
printf("%d\n", max);
return 0;
}
|
逗号操作符
例:exp1,exp2,exo3,…expN
解释:逗号操作符可以按照从左到右的顺序进行运算,并且逗号操作符只保留以后一共表达式的结果,最终结果为最后一个表达式的结果,逗号表达式还可以扩展语句
下标引用、函数调用和结构成员
[ ]
[ ]:下标引用操作符
案例:
int main()
{
int x[10] = { 0 };
x[4];
printf("%d\n", x[5]);
return 0;
}
|
( )
():函数调用操作符
案例:
调用上面函数的案例
int f(int x, int y)
{
int z = x + y;
return z;
}
int main()
{
int a = 5;
int b = 6;
int sum = 0;
sum = f(a, b);
printf("sum=%d\n", sum);
return 0;
}
|
好啦,这一章的学习就到这里咯,我们下期再见