c语言 操作符系统解读

总结大纲

在这里插入图片描述

算术操作符

算数操作符 加减乘除取余数
注意:

  1. 取余数只可以对整数使用

	//3 % 2;
	//3 % 2.0;下面两行都是错误写法 只可以整数取模 
	//3.0 % 2;
  1. / 除号 没有浮点数则商为整数 有浮点数则使用浮点数除法
    在这里插入图片描述
  2. 加减乘除顺序遵循数学法则

移位操作符

<< 左移操作符 左移规则正数源码最左一位舍弃 右边空缺的一位补0

在这里插入图片描述
在这里插入图片描述
负数补码的最左位 舍弃最右边加0
在这里插入图片描述

在这里插入图片描述
注意

  1. 正数直接对源码操作 负数需要操作他的补码
  2. 源码按位取反得到反码,反码加1得到补码
  3. 按位取反时第一位符号位不变
  4. 操作完将补码转换成源码得到操作后的结果

**>>**右移操作符
右移规则

  1. 逻辑移位 左边用0填充,右边丢弃

  2. 算术移位 左边用原该值的符号位填充,右边丢弃
    在这里插入图片描述
    在这里插入图片描述
    注意

  3. 右移采用算术右移

  4. 负数同左移一直 采用对补码操作
    警告
    不可移动负数位!!!!!!

位操作符

位操作符有&按位与,|按位或,按位异或^

& 按位与

按位与只需要将二进制每个位一 一对比
关系如图
在这里插入图片描述

按位与技巧

  1. 奇数 偶数辨别
#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

  1. 取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;
}

在这里插入图片描述

  1. 利用位与 & 运算,判断一个整数是否是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

按位或技巧

  1. 设定一个数据的指定位。
    例如整型数a=321,将其低八位数据置为1的操作为a=a|0XFF。321= 0000 0001 0100 0001 | 0000 0000 1111 1111=0000 0000 1111 1111。

^ 按位异或

在这里插入图片描述
运算规则
位异或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑异或运算。只有当对应位的二进制数互斥的时候,对应位的结果才为真。

按位异或技巧

  1. 不引入其他变量 将两个变量互换
a=a^b;

b=b^a;

a=a^b;
  1. 定位翻转

定位翻转:设定一个数据的指定位,将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;
}

代码分析:

  1. float d=10.2f; 如果改为 float d=10.2; 虽然没有语法错误,可以正常运行,但一般编译器会提示 warning(警告),原因是编译器会把 10.2 等常量默认当成 double 型常量处理,与 d 的类型 float 不一致,故出现警告。因此可通过加 f 明确 10.2 为 float 型常量。

  2. a+=1; 相当于 a=a+1; 求出 a 为 2。

  3. b-=a+5; 由于赋值运算符的优先级低于算术求和运算符,故该语句等价于 b=b-(a+5);,即 b=2-(2+5);,得 b=-5;。同理,c*=a-4; 即 c=3*(2-4);,故 c=-60

  4. 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

sizeof 详解

逻辑操作符

逻辑与 &&

  1. 两边条件都为true时,结果才为true;
  2. 如果有一个为false,结果就为false;
  3. 当第一个条件为false时,就不再判断后面的条件

注意:当数值参与逻辑与运算时,结果为true,那么会返回的会是第二个为真的值;如果结果为false,返回的会是第一个为假的值

逻辑或 ||

1 只要有一个条件为true时,结果就为true;
2 当两个条件都为false时,结果才为false;
3 当一个条件为true时,后面的条件不再判断

注意:当数值参与逻辑或运算时,结果为true,会返回第一个为真的值;如果结果为false,会返回第二个为假的值;

猜你喜欢

转载自blog.csdn.net/qq_45849625/article/details/113730238