1.算数操作符
+ - * / %
2.移位操作符
位移操作符处理的是内存中的二进制序列
数据在内存中储存的是二进制补码
对于正数而言 , 源码,反码,补码相同
对于负数而言 , 反码 为源码符号位不变,其他位按位取反,
补码 为反码 + 1
符号位为最高的一位,1为负,0为正
打印到屏幕上的应该是源码,而不是反码!!!
b.逻辑右移
注意:对于移位操作符,不要移动负数位,这是标准为定义的
int n=4;
n>>-1; X 标准未定义
3.位操作符
举栗子
- //交换两个数字的值
- int main()
- {
- int a = 2;
- int b = 5;
- printf("交换前:a=%d b=%d\n", a, b);
- a = a ^ b;
- b = a ^ b;//a^b ^b
- a = a ^ b;//a^ a^b
- printf("交换后:a=%d b=%d\n", a, b);
- return 0;
- }
注意: a^a=0 0^a=a
- //求一个整数存储在内存中的二进制中1的个数。
- #include <stdio.h>
- int main()
- {
- int num = -1;
- int i = 0;
- int count = 0;//计数
- while (num)
- {
- count++;
- num = num & (num - 1);// & 同时为1时才为1
- //减1 是二进制位的运算
- }
- printf("二进制中1的个数 = %d\n", count);
- return 0;
- }
-1在内存中的二进制补码为
11111111111111111111111111111111
4.赋值操作符
- int a;
- a=5;//把5赋值给a
复合赋值符
5.单目操作符
类别
! 逻辑反操作
- #include<stdio.h>
-
- int main()
- {
- int a = 0;
- if (a)
- printf("666\n");
- else
- printf("wot\n");
- if (!a)
- printf("???\n");
- return 0;
- }
可见 若a为真则 !a 为假,反之亦然
- #include<stdio.h>
- int main()
- {
- int a = 12;
- printf("%d\n", sizeof(a));
- printf("%d\n", sizeof(int));
- printf("%d\n", sizeof a);//这样写行不行?
- return 0;
- }
由此可见sizeof为操作符而非函数
- #include <stdio.h>
- void test1(int arr[])
- {
- printf("%d\n", sizeof(arr));//?
- }
- void test2(char ch[])
- {
- printf("%d\n", sizeof(ch));//?
- }
- int main()
- {
- int arr[10] = { 0 };
- char ch[10] = { 0 };
- printf("%d\n", sizeof(arr));//?
- printf("%d\n", sizeof(ch));//?
- test1(arr);
- test2(ch);
- return 0;
- }
输出的结果是??
- #include <stdio.h>
- void test1(int arr[])//传递的是首元素地址
- {
- printf("%d\n", sizeof(arr));//4
- }
- void test2(char ch[])//传递的是首元素地址
- {
- printf("%d\n", sizeof(ch));//1
- }
- int main()
- {
- int arr[10] = { 0 };//int 4个字节
- char ch[10] = { 0 };//char 1个字节
- printf("%d\n", sizeof(arr));//40
- 4*10=40
- printf("%d\n", sizeof(ch));//10
- 1*10=10
- test1(arr);
- test2(ch);
- return 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; }
6.关系操作符
7.逻辑操作符
-
- #include <stdio.h>
- int main()
- {
- int i = 0,a=0,b=2,c =3,d=4;
- i = a++ && ++b && d++;
- printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
- return 0; }
-
-
输出结果为 1 2 3 4
原因:上方下划线
8.条件(三目)操作符
exp1?exp2:exp3
之前博文提及
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;
- }
从左到右依次计算 a=12 b=13 根据逗号表达式可知c =13
10. 下标引用、函数调用和结构成员
下标引用操作符 [ ]
- #include<stdio.h>
- int Add(int x, int y)
- {
- int z = x + y;
- return z;
- }
- int main()
- {
- int a = 2, c = 3;
- int sum = Add(a,c);//函数调用操作符
- printf("%d\n", sum);
- return 0;
- }
- #include<stdio.h>
- struct stu
- {
- char name[10];
- int age ;
- }s;
- int main()
- {
-
- struct stu s = { "张三",10 };
- printf("%s %d\n", s.name, s.age);
- return 0;
- }
- #include<stdio.h>
- struct stu
- {
- char name[10];
- int age ;
- };
- int main()
- {
-
- struct stu s = { "张三",10 };
- struct stu* sp = &s;
- printf("%s %d\n", sp->name,sp->age );
- return 0;
- }
11表达式求值
- char a,b,c;
- a=b+c;
b和c的值被提升为普通整型,然后再执行加法运算。
- int main()
- {
- char c = 1;
- printf("%u\n", sizeof(c));
- printf("%u\n", sizeof(+c));
- printf("%u\n", sizeof(-c));
- return 0; }
结果为1,4,4
sizeof计算的是表达式的大小,只要c参与运算就会发生整型提升,sizeof虽然不会计算表达式,但要知道表达式的类型
11.2算数转化