话不多说,直接上货!!!
目录
1.算数操作符
+ - * / %
+ :求和
#include <stdio.h> int main() { int a = 5; int b = 5; int c = 0; c = a + b; printf("%d\n",c); return 0; }
- :做差
#include <stdio.h> int main() { int a = 8; int b = 5; int c = 0; c = a - b; printf("%d\n",c); return 0; }
* :求乘积
#include <stdio.h> int main() { int a = 8; int b = 5; int c = 0; c = a*b; printf("%d\n",c); return 0; }
/ :求商省余
#include <stdio.h> int main() { int a = 8; int b = 5; int c = 0; c = a/b; printf("%d\n",c); return 0; }
% :取余略商
#include <stdio.h> int main() { int a = 8; int b = 5; int c = 0; c = a%b; printf("%d\n",c); return 0; }
注: % 操作符的两个操作数必须为整数。
2.移位操作符
<< 左移操作符
>> 右移操作符
注:移动的是数字二进制的补码,用原码输出 原码->反码符号位不变
左移操作符:
左边抛弃、右边补0
正数:
#include <stdio.h> int main() { int a = 3; int b=a << 1; printf("%d\n",b); return 0; }
分析:
负数:
#include <stdio.h> int main() { int a = -3; int b=a << 1; printf("%d\n",b); return 0; }
分析:
右移操作符:
编译器决定:
1. 逻辑移位: 左边用0填充,右边丢弃
2. 算术移位 :左边用原该值的符号位填充,右边丢弃
对于正数来说,无论是逻辑移位还是算数移位,因为正数的符号位为0,两种移位对正数的效果相同,这里我们主要来分析负数。
我的编译器进行了 算术移位
注:对于移位运算符,不要移动负数位,这个是标准未定义的。
int num = 3; num>>-1; //不支持
3.位操作符
& 按位与
| 按位或
^ 按位异或
注:他们的操作数必须是整数,都是直接对数的二进制补码进行操作。
& 两1取1 有0取0
#include <stdio.h> int main() { int a = -3; int b = 5; int c = a&b; printf("%d\n",c); return 0; }
| 有1取1,无1取0
#include <stdio.h> int main() { int a = -3; int b = 5; int c = a|b; printf("%d\n",c); return 0; }
^ 相同为0 相异为1
#include <stdio.h> int main() { int a = -3; int b = 5; int c = a ^ b; printf("%d\n", c); return 0; }
4.赋值操作符
+= -= *= /= %= >>= <<= &= |= ^=
这都是复合运算符
栗子:
int a = -3; int b = 5; a = a + b; //这里a结果为2
可以改成
int a = -3; int b = 5; a += b;
其他运算符以此为例,可类推。
5.单目操作符
! 逻辑反操作
int i=0; scanf("%d",&i); if(i!=3) //这里是 i不等于3 { printf("hr\n"); } printf("%d\n", !2); //输出0 非真为假0表示 printf("%d\n", !0); //输出1 非假为真1表示
+ - 表示数的正负,我们省略
& 取地址
#include <stdio.h> int main() { int b = 5; printf("%p\n",&b); //取b的地址 return 0; }
sizeof 求类型字节大小
#include <stdio.h> int main() { int a = -10; printf("%d\n", sizeof(a)); printf("%d\n", sizeof(int)); printf("%d\n", sizeof a); //a不加括号可行 //printf("%d\n",sizeof int); //类型不带括号是错误的写法 return 0; }
sizeof和数组:
include <stdio.h> void test1(int arr[]) { printf("%d\n", sizeof(arr));// 传入的是数组的首地址,大小为4/8 } void test2(char ch[]) { printf("%d\n", sizeof(ch));// 传入的依旧是首地址,本质为指针,指针的大小4/8 } int main() { int arr[10] = {0}; char ch[10] = {0}; printf("%d\n", sizeof(arr));// 输出的是10个整型的字节大小 40 printf("%d\n", sizeof(ch));// 输出的是10个字符类型的字节大小 10 test1(arr); test2(ch); return 0; }
~ 按位取反
按位取反是对一个数的二进制补码进行操作,0->1,1->0.
注:整个二进制值序列包括符号位也要进行取反
++和--
前置:
#include <stdio.h> int main() { int a = 10; int x = ++a; //先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。x为11。 int y = --a; //先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值。y为10; return 0; }
后置:
#include <stdio.h> int main() { int a = 10; int x = a++; //先对a先使用,再增加,这样x的值是10;之后a变成11; int y = a--; //先对a先使用,再自减,这样y的值是11;之后a变成10; return 0; }
* 间接访问操作符
#include <stdio.h> int main() { int a = -10; int* p = &a; *p = 5; //可以直接访问a地址里的内容,并进行操作 printf("%d\n",a); return 0; }
(类型) 强制类型转换
栗子:
#include <stdio.h> int main() { int a = 50; int b = 14; double ave = 0; ave = a / b; //未强制转换 printf("%lf\n",ave); return 0; }
ave = (double)a / b;
6.关系操作符
> >= < <= != 用于测试“不相等” == 用于测试“相等”
注意小细节"=="和"="要看清楚,是坑
7.逻辑操作符
&& 逻辑与 左边为假,则不继续执行
|| 逻辑或 左边为真,则不继续执行
#include <stdio.h> int main() { int a = 5; if (a > 6 && a < 8) // &&左侧为假,不继续执行 { printf("AA\n"); } else //直接执行else内的语句 printf("BB\n"); return 0; }
#include <stdio.h> int main() { int a = 5; if (a > 1 || a < 3) // ||左侧为真,直接停止向右侧执行 无视右侧为假的条件 { printf("AA\n"); } else printf("BB\n"); return 0; }
8.条件操作符
也叫三目操作符
exp1 ? exp2 : exp3
表达式1为真,计算表达式2
表达式1为假,计算表达式3
#include <stdio.h> int main() { int a = 10; int b = 20; int max = 0; max = (a>b?a:b); printf("%d\n",max); return 0; }
9.逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
#include <stdio.h> int main() { int a = 1; int b = 2; int c = (a > b, a = b + 10, a, b = a + 1); printf("%d\n", c); return 0; }
自左向右依次进行,无关真假,结果是最后一个表达式的果
10.下标引用、函数调用和结构成员
1.[ ] 下标引用操作符
操作数:一个数组名 + 一个索引值
#include <stdio.h> int main() { int arr[10] = { 1, 2, 3, 4, 5, 6, 7 }; printf("%d\n", arr[2]); return 0; }
注:下标从0开始,因此arr数组中3的下标是2
2.( ) 函数调用操作符
#include <stdio.h> void test() { printf("hehe\n"); } int main() { test(); //()为函数调用操作符。 return 0; }
3.访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名
#include <stdio.h> struct book { int price; char name[20]; }; int main() { struct book b1 = {30,"c语言"}; b1.price = 50; printf("%d\n",b1.price); return 0; }
取地址,用指针的话:
struct book*p = &b1; printf("%s\n",p->name);
临近考试了,有些忙,更新会延期,但绝不会断,博客就相当于做笔记,会一直整理下去!!