c语言 操作符系统解读
Posted 万物皆为二叉树
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 操作符系统解读相关的知识,希望对你有一定的参考价值。
操作符详解
总结大纲
算术操作符
算数操作符 加减乘除取余数
注意:
- 取余数只可以对整数使用
//3 % 2;
//3 % 2.0;下面两行都是错误写法 只可以整数取模
//3.0 % 2;
- / 除号 没有浮点数则商为整数 有浮点数则使用浮点数除法
- 加减乘除顺序遵循数学法则
移位操作符
<< 左移操作符 左移规则:正数的源码最左一位舍弃 右边空缺的一位补0
负数的补码的最左位 舍弃最右边加0
注意
- 正数直接对源码操作 负数需要操作他的补码
- 源码按位取反得到反码,反码加1得到补码
- 按位取反时第一位符号位不变
- 操作完将补码转换成源码得到操作后的结果
**>>**右移操作符
右移规则:
-
逻辑移位 左边用0填充,右边丢弃
-
算术移位 左边用原该值的符号位填充,右边丢弃
注意 -
右移采用算术右移
-
负数同左移一直 采用对补码操作
警告
不可移动负数位!!!!!!
位操作符
位操作符有&按位与,|按位或,按位异或^
& 按位与
按位与只需要将二进制每个位一 一对比
关系如图
按位与技巧
- 奇数 偶数辨别
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
int a = 3;
int b = 4;
int c = a & 1;
int d = b & 1;
printf("%d\\n", c);
printf("%d\\n", d);
return 0;
结论
奇数&1==1 偶数&1==0
- 取int型变量a的第k位(k=0,1,2…size of(int) ,从a的二进制形式的右侧数起)
公式 a>>k&1;
e.g 求 8的第三位
由图可知 求位数必须从最左端 0开始计数。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
int e = 8;
int f=e >> 3 & 1;
printf("%d\\n", f);
return 0;
- 利用位与 & 运算,判断一个整数是否是2的整数次幂。
二进制数的位权是以2为底的幂,如果一个整数 m 是 2 的 n 次幂,那么转换为二进制之后只有最高位为 1,其余位置为 0,再观察 m-1 转换为二进制后的形式以及 m&(m-1) 的结果
示例:
int func(int num)
return ((num > 0) && ((num & (num - 1)) == 0));//2的n次幂大于0
| 按位或
运算规则
位或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑或运算。例如:int型常量5和7进行位或运算的表达式为5|7,结果如下:
5= 0000 0000 0000 0101
7= 0000 0000 0000 0111
5|7= 0000 0000 0000 0111
按位或技巧
- 设定一个数据的指定位。
例如整型数a=321,将其低八位数据置为1的操作为a=a|0XFF。321= 0000 0001 0100 0001 | 0000 0000 1111 1111=0000 0000 1111 1111。
^ 按位异或
运算规则
位异或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑异或运算。只有当对应位的二进制数互斥的时候,对应位的结果才为真。
按位异或技巧
- 不引入其他变量 将两个变量互换
a=a^b;
b=b^a;
a=a^b;
- 定位翻转
定位翻转:设定一个数据的指定位,将1换为0,0换为1。例如整型数a=321,,将其低八位数据进行翻位的操作为a=a^0XFF;
赋值操作符
赋值操作是程序设计中最常用的操作之一,C 语言共提供了 11 个赋值运算符,均为二元运算符,其中仅有一个为基本赋值运算符 =,其余 10 个均是复合赋值运算符,即:
基本赋值运算符:=。
复合赋值运算符:+=(加赋值)、-=(减赋值)、*=(乘赋值)、/=(除赋值)、%=(求余赋值)、 <<=(左移赋值)、>>=(右移赋值)、&=(按位与赋值)、|=(按位或赋值)、*A=(按位异或赋值)。
赋值操作的优先级较低,仅高于逗号运算符。
基本赋值 =
如 int a=5; 表示把 5 赋值给整型变量 a,不能读成 “a等于5”。赋值号左边必须为左值,赋值号右边的右值可以为常量、变量或表达式。如下赋值均是正确的。
int a,b; //定义整型变量a和b
a=3; //把常量3赋值给a,右值为常量
b=a; //把变量a的值赋给b,右值为变量
b=a+3; //把求和表达式a+3的值赋给b,右值为表达式
以下赋值均是错误的。
int a=2;
3=a; //错误,常量3不能作为左值
const int b=5; //定义整型常变量只读变量b,并初始化为5,其值不能被改变
b=1; //错误,企图改变常变量的值,即常变量不能作左值
复合赋值:+=、-=、*=、/=、%=
a+=b; 等价于 a=a+b;
a-=b; 等价于 a=a-b;
a*=b; 等价于 a=a*b;
a/=b; 等价于 a=a/b;
例如:
int a=5;
a+=3; //等价于 a=a+3;
由于赋值运算符的优先级很低,仅高于逗号运算符,故最后做赋值操作。
a+=3+2; 等价于 a=a+(3+2);
通过下面的例子,掌握上述 4 种复合赋值运算符。
【例 1】分析以下程序,输出其运行结果。
#include<stdio.h>
int main (void)
int a=l,b=2,c=3; //定义三个整型变量,并初始化
float d=10.2f; //定义float变量d,用浮点常量10.2初始化
a+=1; //相当于 a=a+1;即 a=1+1=2
b-=a+5;
c*=a-4;
printf ("%d,%d,%d,%f",a,b,c,d/=a);
return 0;
代码分析:
-
float d=10.2f; 如果改为 float d=10.2; 虽然没有语法错误,可以正常运行,但一般编译器会提示 warning(警告),原因是编译器会把 10.2 等常量默认当成 double 型常量处理,与 d 的类型 float 不一致,故出现警告。因此可通过加 f 明确 10.2 为 float 型常量。
-
a+=1; 相当于 a=a+1; 求出 a 为 2。
-
b-=a+5; 由于赋值运算符的优先级低于算术求和运算符,故该语句等价于 b=b-(a+5);,即 b=2-(2+5);,得 b=-5;。同理,c*=a-4; 即 c=3*(2-4);,故 c=-60
-
printf("%d,%d,%d,%f",a,b,c,d/=a); 由于输出列表中 a、b 和 c 均为 int 型变量,故输出格式占位符均为 %d;输出列表中第 4 项为表达式,其表达式的值为 d=d/a=10.2f/2=5.1,为浮点类型,输出格式占位符为 %f,在 VC++ 6.0 环境中,float 类型为小数点后保留 6 位数字。
运行结果为:
2,-5,-6,5.100000
单目操作符
逻辑反操作
! 用处就是真的变假的 假的变真的
sizeof
逻辑操作符
逻辑与 &&
- 两边条件都为true时,结果才为true;
- 如果有一个为false,结果就为false;
- 当第一个条件为false时,就不再判断后面的条件
注意:当数值参与逻辑与运算时,结果为true,那么会返回的会是第二个为真的值;如果结果为false,返回的会是第一个为假的值
逻辑或 ||
1 只要有一个条件为true时,结果就为true;
2 当两个条件都为false时,结果才为false;
3 当一个条件为true时,后面的条件不再判断
注意:当数值参与逻辑或运算时,结果为true,会返回第一个为真的值;如果结果为false,会返回第二个为假的值;
以上是关于c语言 操作符系统解读的主要内容,如果未能解决你的问题,请参考以下文章