<C> 运算符 - 2017/11/10
C语言 --> 40多个运算符 运算规则 运算顺序
//表格 运算符 顺序 和名字
顺序: < 不需要背>
1.可以查表
2.可以用括号改变运算优先级
3.不同编程语言运算符优先级未必相同
1、运算符怎么计算
1.1 加减乘除 算数运算符
如: + - * / %(求余 或 取模) 3%4 == 3
a ) 求余 只能对整数求余 (二级的选择题)
b ) 除法 整数除法 最后得到的也是整数(不会四舍五入)
例如:3%4 --> 3-3/4*4
被除数 / 除数 = 商......余数
被除数 = 商 * 除数 + 余数
56%6 --> 56 -56/6*6
56/9=9 56-6*9 ==得到的余数
1.2 二进制运算 (整数的二进制进行运算 直接操作二进制 速度快)
二进制计算 整数 正数 除二求余 负数 原码反码补码(最后用的都是补码)
// 浮点型没有二进制运算
如:
a --> 1101 1010
b --> 1010 1011
二进制 --> 颜色 RGB 255 123 249
red green blue
6位16进制 24位二进制 --> PS 美图秀秀
按位或 | a|b --> 1111 1011 <有 1 则 1 > (一真或为真)
按位与 & a&b --> 1000 1010 <有 0 则 0 > (两真且才真)
按位异或 a~b --> 0111 0001 <相同为零 不同为1>
取反 ~ ~a 所有位数1变0 0变1 0010 0101 <只能对一个数操作>
(负数的反码 原码基础除了最高位全部取反 不要弄混)
左移和右移:
<< a<<2 a左移两位 <1101 1010> --> 0110 1000 前面舍掉两位 后面补0
11的二进制 --> 0000 1011<<2 --> 0010 1100 --> 44
左移一位 相当于乘以2
a --> 1101 1010
如:a>>2 后面舍掉两位 前面补齐 补齐(考虑符号)
int 负数 前面补1
a是unsigned (无符号整数) -> 整数 0
a是int(有符号) --> 最高位表示符号
a是有符号的char 1101 1010
1101 1010 --> 正数或者负数
1.3 关系运算符
大于:>
小于:<
大于等于:>=
小于等于:<=
等于:==
不等于:!=
如:2>3 错误 结果为:0
*********真为:1 假为:0 ************ 重点
逻辑运算符: && 逻辑与 || 逻辑或
3<x<4 是从左往右计算
(x大于3 并且小于4)--> x>3 && x<4 两个条件同时为真 整个条件为真 否则为假
如:今天周三或者今天周日
today==3||today==7 只要两个条件中的一个为真 整个条件就为真
!(x>3) 如果x等于4 整个式子为假 x等于1 整个式子为真
(真变假 假变真)
a). 或和与
或 如果左边条件为真 右边可以跳过 补计算 截断
与 左边条件为假 右边不计算
b). 非
!4<5(真) 如果把数字当条件 假 0 真1 非0
!0 -->1
1.4 赋值运算符
== 关系运算符中的等于
=赋值运算符 右边的值赋给左边的值
// 赋值运算符左边一定要是变量
// x+1=3
z=x=y=1; // // 二级题目:z=x+1=y==1
赋值从右往左算 a=3
a+=a-=a*a --> a-=a*a --> a=a-a*a --> a=a+a
a=3-3*3=-6 --> -12
1.5点运算符和箭头运算符
结构体中讲到
. 点运算符 结构体成员
-> 箭头运算符 指针访问结构体成员
《指针会讲到的》
* 取值/解引用
& 取变量地址 // x*y 乘号 *p 取值
sizeof(int)计算类型大小(单位是字节)
自增自减: ++ --
x++ x=x+1; // 给变量加1
++x x++(前置++快于后置++)
++x 立刻加1
x++ 等一会再加 1
y=x++; // y得到x当前的值 x再加1 y=++x; // 先让x加1 然后再赋值
x = i++ + i++ + i; // C未定义 在同一个式子 不要对同一个变量进行多次++操作
易读性
负号 y=-x --> 号前面没有任何的变量或者值 负号
三目 语句1? 语句2? :语句3?
先判断语句1 为真执行:语句2 为假执行:语句3
逗号运算符 优先级最低
int x=3,4,56; // x=3,4,5,6,7; // x得到的值:3 x=(3,4,5,6,7); // x得到的值:7
逗号运算符最后的结果 就是最后一个表达式的值
代码块:
#include <stdio.h> #include <math.h> int main() { #if 0 int x = 3, y = 4; printf("%d\n", x%y); // 求余 printf("%d\n", x/y); // 除法 #elif 0 int a = 11; // 0000 1011 --> 0010 1100 printf("%d\n", a << 3); int x = 3, y = 4; double z = 4.0; char ch1 = 0xda; // 1101 1010 unsigned ch2 = 0xda; // 无符号 前面补 0 后面补 1 printf("%d\t%d\n", ch1 >> 2, ch2 >> 2); printf("%d\t%d\n", ch1, ch2); //printf("%d", x*pow(2.0, 32)); // pow(2.0,23) 2的32次方 #elif 0 // 关系运算符 int x = 3, y = 4; printf("%d", x > y); printf("%", !0); #elif 1 int x = 3, y = 4; int i = 0; x = i++ + i++ + i; printf("%d\ti=%d\n", x, i); // 打印x和y的最大值 int n = 3, m = 4, z = 5; //n > m ? printf("%d", n) : printf("%d", m); printf("%d\n", n > y ? x : y); getchar(); n > m ? (n > z ? n : z) : (y > z ? y : z); // 嵌套 z = n > m ? 1, 2, 3, 4 : 4, 5, 6, 7; printf("%d %d %d\n", n, m, z); #endif getchar(); return 0; }
/*
** 1101 1000 --> 可以是正数 可以是负数
** 左移 连最高位也一起操作 最后得到的结果可能是正数可能是负数
*/