今天来了解一下各类操作符
操作符
算数操作符
+ - * / %
/
除法
这是正常运算
但换成7/2时,打印出的结果竟然是3?
我第一次见到也很困惑 (・-・*)
查过后才知道:由于7和2都是整型,所以打印出来的也是整型3
要想打出3.5,就必须将7换成1.0或将2换成2.0,或者两者都换,还必须将 %d 换成 %lf (打印float类型的数据用 %lf )
但是我们就想只打印3.5怎么办?
在 lf 前面加个 .1 就可以了,这里的 .1 就表示只打印小数点后一位
%
叫做取模/取余
这里7除2余1,所以结果也是1
移位操作符
<< 左移操作符
>> 右移操作符
注:移位操作符的操作数只能是整数。
这里的左移右移又是怎么回事呢?
且听我细细道来~
比如创建一个整型 a
int a = 1;
一个整型 4 byte = 32 bit
将1写进32比特位的空间里,就要写32个二进制位
00000000000000000000000000000001
a 就占据了上述空间,而移位操作符就是将上述二进制序列整体移动
这里涉及二进制的计算和存储,后面会细讲,这里先卖个关子
位操作符
& //按位与
| //按位或
^ //按位异或
注:他们的操作数必须是整数。
位:二进制位
赋值操作符
= += -= *= /= &= ^= |= >>= <<=
= 是赋值操作符
后面的都叫复合操作符
+=、-=、*=、/=
a=a+5;
就可以简化成
a+=5;
后面的同理
单目操作符
! 逻辑反操作符
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符
(类型) 强制类型转换
这里。。。什么叫单目操作符呢?
当我们使用 + 时
2 + 3
+ 叫操作符
2 叫左操作数
3 右操作数
所以 + 就叫做双目操作符
只有一个操作数的操作符就是 单目操作数
!
逻辑反操作
C语言如何表示真假?
0表示假
非0表示真
我们创造一个变量 a 输入并打印
这里我们输入1,因为1非0,所以正常打印应该是1
而!是逻辑反操作,能把真的变成假的,把假的变成真的,所以最后一行打印的是0;
我们再次输入 0 ,最后一行因为 ! 打印的是1.
!的应用
我们在使用if语句时
这里插播一下:
if语句是一个条件语句
格式是
if(条件)
{...}
或
if(条件)
{...}
else
{...}
以及
if(条件)
{...}
else if(条件)
{...}
...
else
{...}
这里不细讲
回到上面
当我们使用if语句时
这里的 if(flag)表示如果flag为真就打印hehe
if(flag)表示如果flag为假就打印haha
中场休息一下。。
sizeof
操作数的类型长度
这个通常是定值
变量的本质是向内存申请空间,一个内存单元是一个字节
这里的变量 a 就是向内存申请空间
int main()
{
int a = 10;
return 0;
}
由于 int 类型所占空间是4个字节,所以10就被储存在下面4个字节
我们再试着打印 a 所占的空间,发现与上面的 int 类型大小一样
sizeof计算变量大小时变量的括号可以省略,但计算类型是的括号不能省略
所以证明 sizeof 不是函数操作符
这里第一个 sizeof 计算的是数组arr的总大小
第二个计算的是单个数组的大小
第三个则是数组含有元素的大小
那么 strlen 和 sizeof 之间究竟有怎样的不同呢?
我们从这段代码入手
#include<stdio.h>
int main()
{
char arr1[]="abc";
char arr2[]={ 'a', 'b', 'c' };
printf("%d\n",strlen(arr1));
printf("%d\n",strlen(arr2));
printf("%d\n",sizeof(arr1));
printf("%d\n",sizeof(arr2));
return 0;
}
先来看一下打印出来的效果
析:
第一行计算的是代码的长度,且 \0 不被计入长度,所以结果是3
第二行由于不知道 \0 具体在哪,所以结果是随机值
第三行sizeof只关注占据内存空间的大小 arr1是 a b c \0,所以占据4个字节,打印结果就是4
第四行中只有 a b c,打印出来的结果就是3
strlen 是库函数
strlen 是求字符串长度的,关注的字符串中是否有 \0 ,统计 \0 之前出席拿的字符个数
sizeof 是操作符
sizeof 只关注占据了多大的内存空间,不关注内存中存放的数据
sizeof 返回值的单位是字节
++、--
++的效果就是+1,--的就是-1
这里的++a的意思是先++,后使用:a+=1,a=11,将a++后的结果赋给b,所以b也等于11
a++的意思就是先使用,再++。这里a=10,x先赋给b,再++,后变为11
--同理
(类型)
强制类型转换
这里的3.14是double类型的,运行时会报错
为了正常运行,又不改变前面的 int 就要对3.14进行强制类型转换
关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
逻辑操作符
&& 逻辑与
| | 逻辑或
&& 相当于生活中的并且
||相当于或者
都只关注真和假
下面的代码意思是 如果a与b都是真,那么打印hehe
条件操作符(也叫三目操作符)
exp1 ?exp2 : exp3
这个操作符的意思是:
如果表达式1为真,那么表达式2算,3不算
如果表达式1为假,那么表达式2不算,3算
应用实例
逗号表达式
exp1 ,exp2, exp3, ...expN
逗号表达式会从左向右依次计算,但是整个表达式的结果是最后一个表达式的结果
下标引用、函数调用和结构成员
[ ] 下标引用操作符
( ) 函数调用操作符
. 结构体.成员名
-> 结构体指针->成员名
下标引用是应用在数组里的
这里的意思就是 打印数组里下标为7的数字
红框里的括号就是 函数调用操作符
结构体,较为复杂,这里只提一嘴
欧了,今天的内容也完了,东西较多,慢慢消化