前言:
●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!
——By 作者:新晓·故知
操作符详解<1>:编辑
题例:
#include <stdio.h> int main() { //(3,4) - 逗号表达式,结果是最后一个表达式的结果 int arr[] = { 1,2,(3,4),5 }; printf("%d\n", sizeof(arr)); return 0; }
编辑
#include <string.h> #include <stdio.h> int main() { char str[] = "hello bit"; printf("%d %d\n", sizeof(str), strlen(str)); return 0; }
编辑
//创建一个整形数组,完成对数组的操作 // //实现函数init() 初始化数组为全0 //实现print() 打印数组的每个元素 //实现reverse() 函数完成数组元素的逆置。 #include <stdio.h> void init(int arr[], int sz) { int i = 0; for (i = 0; i < sz; i++) { arr[i] = 0; } } void print(int arr[], int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } printf("\n"); } void reverse(int arr[], int sz) { int left = 0; int right = sz-1; while (left<right) { int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; left++; right--; } } int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,10}; //init int sz = sizeof(arr) / sizeof(arr[0]); print(arr, sz); reverse(arr, sz); print(arr, sz); //init(arr, sz); init(arr[10],sz)是数组第11个元素,访问越界,因此传参只需传递数组名arr //print(arr, sz); return 0; }
编辑
编辑
将数组A中的内容和数组B中的内容进行交换。(数组一样大) int main() { int arr1[] = { 1,3,5,7,9 }; int arr2[] = { 2,4,6,8,10 }; //交换 int tmp = 0; int i = 0; int sz = sizeof(arr1) / sizeof(arr1[0]); for (i = 0; i < sz; i++) { tmp = arr1[i]; arr1[i] = arr2[i]; arr2[i] = tmp; } return 0; }
编辑
1. 操作符分类:
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
2. 算术操作符
+ - * / %
注:
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
int main() { //int ret = 10 % 3;//% - 取模(余) - 得到的是相除之后的余数 int ret = 10 / 3;//除法 - 商 printf("%d\n", ret); 当 /(除号) 两端都是整数的时候,执行的是整数除法,两端只要有一个浮点数,执行的就是浮点数的除法 //double ret = 10.0 / 3.0; //printf("%lf\n", ret); //10.0 % 3;//err return 0; }
当 /(除号) 两端都是整数的时候,执行的是整数除法,两端只要有一个浮点数,执行的就是浮点数的除法
编辑
编辑
编辑
移位运算 int main() { int a = -5; //把a在内存中存储的二进制位向左移动2位 int b = a << 2; printf("%d\n", b); printf("%d\n", a); //int a = -1; return 0; }
3.移位操作符
1.<<左移操作符
>> 右移操作符 注:移位操作符的操作数只能是整数。
左移操作符 移位规则: 左边抛弃、右边补0
编辑
2.右移操作符
移位规则: 首先右移运算分两种: 1. 逻辑移位 左边用0填充,右边丢弃 2. 算术移位 左边用原该值的符号位填充,右边丢弃
编辑
警告⚠ :
对于移位运算符,不要移动负数位,这个是标准未定义的。
例如: int num = 10; num>>-1;//error
编辑
4. 位操作符
& //按位与
| //按位或
^ //按位异或
注:他们的操作数必须是整数。
不能创建临时变量(第三个变量),实现两个数的交换
#include <stdio.h> int main() { int a = 10; int b = 20; a = a ^ b; b = a ^ b; a = a ^ b; printf("a = %d b = %d\n", a, b); return 0; }
编辑
编辑
编辑
编辑
方法1问题:繁琐,但常用
方法2问题:可能超出整型范围
方法3问题:异或不常用编辑
编辑
int main() { int a = 0; //~ 按(内存中补码的2进制)位取反 //00000000000000000000000000000000 //11111111111111111111111111111111 - 补码 //11111111111111111111111111111110 - 反码 //10000000000000000000000000000001 - 原码 --> -1 printf("%d\n", ~a); return 0; }
编辑
int main() { int a = 10; a |= (1 << 2); printf("%d\n", a); a &= ~(1 << 2); printf("%d\n", a); //00000000000000000000000000001010 //00000000000000000000000000000100 1<<2 //00000000000000000000000000001110 //11111111111111111111111111111011 ~(1<<2) //00000000000000000000000000001010 return 0; }
编辑
5. 赋值操作符
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋 值。
int weight = 120;//体重 weight = 89;//不满意就赋值 double salary = 10000.0; salary = 20000.0;//使用赋值操作符赋值。 赋值操作符可以连续使用,比如: int a = 10; int x = 0; int y = 20; a = x = y+1;//连续赋值 这样的代码感觉怎么样? 那同样的语义,你看看: x = y+1; a = x; 这样的写法是不是更加清晰爽朗而且易于调试。
编辑
复合赋值符:
+= -= *= /= %= >>= <<= &= |= ^=
这些运算符都可以写成复合的效果。 比如:
6.单目操作符
6.1 单目操作符介绍
赋值操作符可以连续使用,比如: int a = 10; int x = 0; int y = 20; a = x = y+1;//连续赋值 这样的代码感觉怎么样? 那同样的语义,你看看: x = y+1; a = x; 这样的写法是不是更加清晰爽朗而且易于调试。 int x = 10; x = x+10; x += 10;//复合赋值 //其他运算符一样的道理。这样写更加简洁。 ! 逻辑反操作 - 负值 + 正值 & 取地址 sizeof 操作数的类型长度(以字节为单位) ~ 对一个数的二进制按位取反 -- 前置、后置-- ++ 前置、后置++ * 间接访问操作符(解引用操作符) (类型) 强制类型转换
演示代码:
编辑
#include <stdio.h> int main() { int a = -10; int *p = NULL; printf("%d\n", !2); printf("%d\n", !0); a = -a; p = &a; printf("%d\n", sizeof(a)); printf("%d\n", sizeof(int)); printf("%d\n", sizeof a);//这样写行不行? printf("%d\n", sizeof int);//这样写行不行? return 0; }
编辑
编辑