一、赋值操作符
=
赋值操作符是一个很棒的操作符 它可以修改一个你之前不喜欢的数值
例
这里只使用了一行代码就将a的值改变啦
赋值操作符是可以连续赋值的
这样子
但是这样子的代码显然是可读性比较差的
所以我们尽量将他们分开来写
换成两行代码之后可读性就好了许多
复合操作符
上面两行代码 表达的意思是一样的
二、单目操作符
1. ! 逻辑反操作符
例如
a=3; 我们都知道3在计算中表示为真
那么我们在3前面加上一个!呢 是不是就表示为假了
同理 ! 0 就表示为真
2. & 取地址操作符
& 操作符可以取出一个元素的地址
这里需要注意的是 我们使用sacnf()函数的时候后面输入的要是一个地址 不然会报错 楼主在初学c语言的时候经常因为这个原因编译错误
3. sizeof操作符
请问上面这段代码会依次输出那几个数呢?(64位操作系统)
正确答案是40 10 4 4
因为第一个打印的arr 和arr1是两个数组的大小 分别是4x10 和1x10
而test1 test2则是两个指针在64位的系统上指针大小为4
4. 单目操作符的顺序
三、++ - -操作符
这里需要注意的一个点主要是前置++还是后置++
大家只要记住
前置++就是先++ 后使用
后置++ 就是先使用 后++
四、关系操作符
>
>=
<
<=
!= 用于测试 “ 不相等 ”
== 用于测试 “ 相等 ”
这些没有什么好讲的 大家使用的时候注意别打错就好
五、 逻辑操作符
&& 逻辑与
| | 逻辑或
&&逻辑与要两边都是真才为真 否则就是假
例如
1&&2=1
0&&2=0
|| 逻辑或只要有一边为真就是真 否则为假
0||1=1
0||0=0
2||1=1
关于逻辑与操作符 这里有一道360的笔试题
这个时候a d c d值的大小分别是多少
如果逻辑与换成逻辑或者呢
我们讲 &&的定义是 只要有假就全为假
所以当看第一个数a++的时候 就已经确定了为假
所以后面就不用计算了
值为
1 2 3 4
||的定义是只要有真的为真
当我们看到 第二个数b=3为真的时候后面就不用算了
所以值为
1 3 3 4
六、 条件操作符
exp1?exp2:exp3
它的定义是 判断条件1是否为真
如果为真输出exp2
如果为假输出exp3
那么请你写出一个函数来比较两个数大小 返回比较大的那个数
七、逗号表达式
exp1,exp2,exp3,exp4…expN
逗号表达式 就是用逗号隔开的多个表达式
从左向右依次执行 输出的是最后一个表达式的结果
八、下标引用 函数调用
1.[]下标引用操作符
例如
2 .()函数调用操作符
接受一个或者多个操作数 第一个是函数名 其他的就是传递给函数的参数
九、结构成员访问操作符
我们可以使用 . 操作符以及 ->操作符来访问结构体的成员
十、表达式求值
表达式求值的顺序一部分是由操作符的优先级和结核性决定
而有些表达式的操作数在求值的过程中可能需要转化为其他数据类型。
1. 整型提升 (小于4个字节)
为什么会发生整型提升?
因为cpu的内整型运算器(ALU)的操作数的字节长度一般就是int 的字节长度 同时也是cpu的通用寄存器长度
因为 两个char类型的相加 在cpu执行的时候也要先抓华为cpu内整型的操作数长度标准
这里补充下整型提升的规律
对于有符号数来说:
前面补上它的符号位
对于无符号为数来说:
前面补上0
例如
char a,b,c
a=b+c;
b和c的值都会被先提升为整形再来进行计算
打印出来的结果应该是c
因为a b在比较大小的时候都进行了整型提升 都变成了负数 和原来的值不相等了
但是c因为本来就是整型 所以没有变化
所以程序输出的结果是
c
正确答案是1 4 4 4
这是为什么呢
第一个不用解释
2 3 4 这三个表达式都进行了运算 所以要进行整型提升
所以他们打印出来全部都是4个字节
2. 算数转换(大于4个字节)
float f =3.14
int unm=f
这里就会进行算数转换
3. 操作符的属性
复杂表达式的求值有三个影响因素
1 操作符的优先级
2 操作符的结核性
3 是否控制求值顺序
几个问题表达式
c+ —c;
我们不知道操作符的左操作数的获取在右操作数之前还是之后求值
所以结果是不可预测的
int i =10;
i = i-- - --i + ++i +i++
同样的问题
这个表达式在不同编译器上获取的结果是完全不一样的
int i=1
int ret=(++i)+(++i)+(++i)
实际上上面的表达式就算是加上括号任然是有问题的
我们在执行第一个+的时候 第三个++是否执行 这个是不确定的 因为依靠操作符的优先级和结合性无法决定第一个+和第三个前置++的先后顺序
总结 如果我们写出的表达式不能通过操作符的属性确定唯一的计算路径 那么这个表达式就是存在问题的