首页 > 其他分享 >嵌入式课程day05-C语言运算符和选择结构

嵌入式课程day05-C语言运算符和选择结构

时间:2024-11-01 20:47:49浏览次数:3  
标签:10 二进制 int day05 C语言 运算符 ++ 表达式

4.8其他运算符

自增自减:++ --

三目运算符: ? :

复合运算符:+=  -= *= /= %=  

&=  |= ^=  <<= >>=

逗号运算符: ,

4.8.1自增自减:++ --

实现变量的+1 或者 -1操作

++:单目运算符

前置:++a

后置:a++

①如果 ++运算符作为单独语句使用++在前,++在后没有区别

②如果 ++ 运算符参与其他运算(表达式中除了++之外还有其他运算符), ++在前--先加后用,++是先用后加。

举例1:

int a = 5;
int b = 5;
                
a++;    // a = a + 1
++b;   //  b = b + 1

printf("%d %d",a,b);   // 6   6

举例2:
 

int a = 5;
int b = 5;

int c = a++;   // 先用a的值作为a++表达式的结果。 c=a;  a = a +1;
int d = ++b;   // 先执行b=b+1=6 , ++b表达式的结果就是 6   d = 6;

printf("%d %d",c,d); // 5   6

4.8.2三目运算符: ? :

格式:表达式1?表达式2:表达式3

运算规则:先计算表达式1的值,如果为真,则取表达式2的值作为三目运算符的结果,否则取表达式3的值

样例:求两个数中的最小值

#include<stdio.h>
int main()
{
	int a,b;
    scanf("%d",&a,&b);
    int c;//存储a,b的最小值
    c=a<b?a:b;
	return 0;
}

如果a<b为真,则取a的值作为表达式的结果赋值给c;否则,则取b的值作为表达式的结果 赋值给c。

4.8.3复合运算符:+=、-=

+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=

a+=5;等价于a = a+5;

4.8.4逗号运算符: ,

优先级最低,比赋值运算符还要低。

格式:表达式1,表达式2。

规则:从左往右计算,最后一个表达式的结果和类型作为逗号运算符的结果和类型。

 样例

#include<stdio.h>
int main()
{
	int a = 3;
    int b = 4;
    int c = (a++,a+=b,b++);
    printf("%d",c);    //4
	return 0;
}

练习:输入三个整型数据,使用三目运算符,获取3个数据中的最大值。

#include<stdio.h>
int main()
{
	int a,b,c,d;
	scanf("%d%d%d",&a,&b,&c);
	d=c>a?c:a;
	printf("%d",d>b?d:b);
	return 0;
}

4.9位运算符

&、|、~、<<、>>。

4.9.1按位与:&

用法:表达式1&表达式2。

规则:

将表达式1和表达式2的结果运算拿出来,并且还要转成二进制补码

按照低位对齐

总结:“全1为1,有0则0”

样例:

10&25(按8位空间存储)

0000 1010——10

0001 1001——25

0000 1000——8

printf("%d",10&25);     //8

应用场景:(用它有0则0的规则),将一个数据的二进制某一位置置0。

4.9.2按位或:|

用法:表达式1|表达式2

规则:

将表达式1和表达式2的结果运算拿出来,并且还要转成二进制补码。

按照低位对齐。

总结:“有1则1,全0为0”

 样例:

10|25(按8位空间存储)

0000 1010——10

0001 1001——25

0001 1011——27

printf("%d",10|25);     //27

应用场景:(用它有1则1的规则)将一个数据的二进制某一位置1,其他位不变。

int a;//这里只看低8位

//将第四位置1

xxxx x10x——4
0001 0000——16(0b 0001 0000)
xxx1 x10x——20

printf("%d",4|16);     //20

4.9.3左移:<<

用法: 表达式1 << 移动位数

规则:将表达式1的结果运算拿出来,并且还要转成二进制补码, "高位溢出舍弃,低位补0,移动几位就补几个0"

样例:

10 << 1 ---- 20 10*2^1
10 << 2 ---- 40 10*2^2

10 << n ----    10*2^n

场景:构造任意某一位上是1其他位是0的数:   1 << n

4.9.4右移:>>

用法: 表达式1 >> 移动位数

规则:将表达式1的结果运算拿出来,并且还要转成二进制补码, "高位补符号位数字(无符号则补0),低位溢出舍弃,移动几位就补几个0"

10 >> 1 ---- 5
10 >> 2 ---- 2
10 >> n ---- 10 / 2^n

应用场景:提取一个二进制数据中的某一数据

举例:提取0x67、0x4567

int a = 0x12345678
a >> 4;    //0x01234567
unsigned char t = a;
unsigned short u = a;

4.9.5按位取反:~

用法: ~表达式

规则:先计算表达式的结果,转为二进制补码

“所有位0变1,1变0”

int a = 10;
int b = ~a;
// b = -11;

场景:构造任意某一位上是0其他位是1: ~(1 << n)

4.9.6按位异或:^

用法:表达式1 ^ 表达式2;
规则:将表达式1和表达式2的结果运算拿出来,并且还要转成二进制补码,按照低位对齐。
总结:“相同为0,不同为1。”

练习:// 控制它的第4位让它的第4位置0和1之间进行翻转。

int a;
scanf("%x",&a);
a ^= (1 << 4);
printf("%x\n",a);

4.10位操作练习题

4.10.1将一个数据a的二进制第n位置0,其他位不变

a &= ~(1 << n);

4.10.2将一个数据a的二进制第n位置1,其他位不变

a |= (1 << n);

4.10.3将一个数据a的二进制的第n+1位和第n位 同时置0,其他位保持不变

a &= ~(3 << n);

4.10.4将一个数据a的二进制第n+1位和第n位置1,其他位不变

a |= (3 << n);

4.10.5将一个数据a的二进制第n+1位和第n位置01,其他位不变

先同时置00,a &= ~(3 << n);

然后再单独置1,a |= (1 << n);

4.10.6将一个数据a的二进制第n+1位和第n位置10,其他位不变

先同时置00,a &= ~(3 << n);

然后再单独置1,a |= (2 << n);

4.10.7将一个数据a的二进制的第n位是0或者1之间进行翻转 

a ^= (1 << n);

4.10.8判断一个数据a的第n位是0还是1

#include<stdio.h>
int main()
{
	int a;
	scanf("%d",a);
	if(a & (1 << n))
	    printf("第n位是1");
	else 
	    printf("第n位是0");
	return 0;
}

标签:10,二进制,int,day05,C语言,运算符,++,表达式
From: https://blog.csdn.net/m0_56934903/article/details/143425710

相关文章

  • C语言浮点数实现之实例(二)
            上一章《C语言浮点数实现(一)》给大家讲解了浮点数的由来、组成以及由于浮点数导致的世界级重大事故,以提高大家对学习浮点数积极性,了解浮点数的重要性。虽说大多数场景基本上不会在意这些细节,但是难免会遇见少数场景哈!例如:某迪的底盘团队就遇见过,如果没记错的话,......
  • C语言系列之函数
    C语言系列之函数一、函数的概念二、库函数2.1标准库和头文件2.2库函数的使用2.2.1功能2.2.2头文件包含2.2.3实践2.2.4库函数文档的一般格式三、自定义函数3.1函数的语法形式3.2自定义函数的实例四、形参和实参4.1实参4.2形参4.3形参与实参的关系五、return语句六、数......
  • 21点游戏(简易版)的C语言实现
    新人做的第一个小游戏,以后可能会改为更为严谨的规则,以及加入筹码。代码如下:#include<stdio.h>#include<time.h>#include<stdlib.h>staticintyes1=1,yes2=1;/*非0代表能继续摸牌*/voidintroduction()/*介绍游戏规则*/{ printf("BlackJack(21点)游戏规则:\n2......
  • c语言的一些排序算法
    文章目录前言一、......
  • javascript 基本语法,变量,运算符【知识点整理】
    JavaScript(ES5)JavaScript的基本语法和变量变量声明与变量赋值的方法:vara=5;vara=5;varb=4;vara=3,b=2;vara,b,c=5;vara=b=c=1;变量的命名规范首字符:英文和下划线组成:英文数字下划线禁忌:关键字、保留字##Unicode在HTML中,Unicode字符......
  • 重温c语言之,7天开整,就是随便的写写,第二天
    一:操作符除法:如果都是整数,除数,被除数都是整数,那么结果:就是整数的商(没有小数部分的),例如:7/2=3;如果除数或者被除数其中一个是浮点数,那么结果就是(条件是:能除尽的,并且小数在基础数据类型包含下的)完整的商(包含小数部分的):例如:7/2.0=3.500000;如果想要在pr......
  • (C语言)两个字符串的第一个字母合并
    #include<stdio.h>#include<string.h>voidNONO();voidfun(char*a,char*b){ char*p=a; //将字符串a的地址赋值给指针p方便访问 inti,k=1; //k=1使从第二个空间输入 while(*p=='') //将字符串前面的空格跳过 { p++; } *b=*p; //输入第一个字母......
  • 51c~C语言~合集1
    一、C语言和C++的区别 C语言虽说经常和C++在一起被大家提起,但可千万不要以为它们是一个东西。现在我们常用的C语言是C89标准,C++是C++99标准的。C89就是在1989年制定的标准,如今最新的是C11和C++11标准。根据不同的标准,它们的功能也会有所不同,但是越新的版本支持的编译器越少,所以本......
  • (C语言)动态内存管理,柔性数组
    1.为什么存在动态内存分配动态内存管理是C语言提供给我们自主维护空间大小的能力C语言提供了一个动态内存开辟的函数:void*malloc(size_tsize);这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。·如果开辟成功,则返回一个指向开辟好空间的指针。·......
  • C语言的一些Hacking写法
    很显然,这些写法大多并不规范,也不被提倡。很显然,咱并没有在windows下试过这些代码,而且实测大部分在线编程网站用的是Linux,可以接受GNUC扩展支持。如果有人问我为什么折腾,为什么以折腾这些无聊的东西作为目标,那他们完全可以问,为什么要登上最高峰?为什么人类要登月?………我选择去折......