当前位置: 首页 > news >正文

C--操作符

如果您觉得这篇文章对您有帮助的话
欢迎您分享给更多人哦

请添加图片描述

感谢大家的点赞收藏评论,感谢您的支持

一:操作符讲解

//16进制的数值之前写:0x
//8进制的数值之前写:0
数字以0开头会被当成8进制
0153:107(10进制)
0x6B:107

1.1(&.|.^.~):都是补码计算,最高位符号位也是按位,最后计算出来看看是+还是负,%d一律打印源码啊(有符号数)

int main()
{
	int n = -2;
	int m = 3;
	printf("%d\n", n & m);//2
	printf("%d\n", n | m);//-3
	printf("%d\n", n ^ m);//-1
	printf("%d", ~0);
	return  0;
}

1.2(不能创建临时变量(第三个变量),实现两个整数的交换)

int main()
{
	int a = 10;
	int b = 20;
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("%d %d", a, b);
	return 0;
}

1.3:计算一个数二进制有多少位1

方法一:

它会不断将 num 除以2(相当于右移一位),并检查每次操作后的最低位是否为1
(通过 num%2)。如果是,则计数器 count 增加。
110100101(先%后除)
#include <stdio.h>
int main()
{
 int num = 10;
 int count= 0;//计数
 while(num)
 {
 if(num%2 == 1)
 count++;
 num = num/2;
 }
 printf("⼆进制中1的个数 = %d\n", count);
 return 0;
}

方法二:

#include <stdio.h>
int main()
{
 int num = -1;
 int i = 0;
 int count = 0;//计数
 for(i=0; i<32; i++)
 {
 if( num & (1 << i) ) //(((n>>i)&i)==1)也可以,这个类似方法一
 count++; 
 }
 printf("⼆进制中1的个数 = %d\n",count);
 return 0;
}

方法三:

int main()
{
 int num = -1;
 int i = 0;
 int count = 0;//计数
 while(num)
 {
 count++;
 num = num&(num-1);
 //1101010111与上 下面这个
 //1101010110
 然后
 //1101010110与上下面这个(每次都是少一个最后一位1,本质都是方法一)
 //1101010101
 }
 printf("⼆进制中1的个数 = %d\n",count);
 return 0;
}

1.4:编写代码将13⼆进制序列的第5位修改为1,然后再改回0

13的2进制序列: 00000000000000000000000000001101
将第5位置为1后:00000000000000000000000000011101
将第5位再置为0:00000000000000000000000000001101

#include <stdio.h>
int main()
{
 int a = 13;
 a = a | (1<<4);            或上个  00010000
 printf("a = %d\n", a);
 a = a & ~(1<<4);           再与上个 11101111
 printf("a = %d\n", a);
 return 0;
}

2

2.1(逗号表达式)

逗号表达式,就是⽤逗号隔开的多个表达式。
逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果

int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
a是否大于吧根本不重要,没啥影响,b=13
//代码2
if (a =b + 1, c=a / 2, d > 0),就是判断d是否大于0;前面一堆数字丢没有关于d的,没啥用
a = get_val();
count_val(a);
while (a > 0)
{
 //业务处理
 //...
 a = get_val();
 count_val(a);
}
如果使⽤逗号表达式,改写:
while (a = get_val(), count_val(a), a>0)
{
 //业务处理
}

2.2:结构体

描述一个学生
struct Stu
{
 char name[20];//名字
 int age;//年龄
 char sex[5];//性别
 char id[20];//学号
}; //分号不能丢

struct Stu s2 = {.age=20, .name="lisi"};//指定顺序初始化

struct Node
{
 int data;
 struct Point p;
 struct Node* next; 
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化

有时候我们得到的不是⼀个结构体变量,⽽是得到了⼀个指向结构体的指针。如下

#include <stdio.h>
struct Point
{
 int x;
 int y;
};
int main()
{
 struct Point p = {3, 4};
 struct Point *ptr = &p;
 ptr->x = 10;
 ptr->y = 20;
 printf("x = %d y = %d\n", ptr->x, ptr->y);
 return 0;
}

3.1整形提升:

(无符高位补0,有符号数高位补符号位)
11.1 整型提升
C语⾔中整型算术运算总是⾄少以缺省(默认)整型类型的精度来进⾏的。
为了获得这个精度,表达式中的字符(char)和短整型(short)操作数在使用之前被转换为普通整型,这种转换称为整型提升。

1.表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节⻓度⼀般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。

2.因此,即使两个char类型的相加,在CPU执⾏时实际上也要先转换为CPU内整型操作数的标准⻓度。

3.所以,表达式中各种⻓度可能⼩于int⻓度的整型值,都必须先转换为
int或unsigned int,然后才能送⼊CPU去执⾏运算

char a,b,c;
...
a = b + c;

b和c的值被提升为普通整型,然后再执⾏加法运算。
加法运算完成之后,结果将被截断,然后再存储于a中。

3.2:算术转换

如果某个操作符的各个操作数属于不同的类型,那么除⾮其中⼀个操作数的转换为另⼀个操作数的类型,否则操作就⽆法进⾏。下⾯的层次体系称为寻常算数转换

在这里插入图片描述

4

即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯⼀的计算路径,那这个表达式就是存在潜在⻛险的,建议不要写出特别复杂的表达式。

c+--c;
同上,操作符的优先级只能决定⾃减 -- 的运算在 + 的运算的前⾯,但是我们并没有办法得知, + 操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义的。

相关文章:

  • 企业概况的模板范文企业网站优化
  • 华艺网站开发口碑营销属于什么营销
  • 外贸公司代理seo实战密码第三版
  • 创建免费网站需要什么条件网络营销实训总结报告
  • 做自媒体那几个网站好点廊坊seo
  • 注册公司域名后如何做网站外贸营销型网站制作
  • AI人工智能-PyCharm的介绍安装应用
  • Vue学习笔记集--defineExpose
  • CSP-J 2019 入门级 第一轮(初赛) 完善程序(2)
  • 协程 Coroutine
  • 综合实验一
  • Arduino示例代码讲解:Virtual Color Mixer 虚拟混色器
  • CS提取的基本使用和模块加载
  • 树莓派超全系列文档--(14)无需交互使用raspi-config工具其一
  • 记录vite-plugin-dts打包时无法生成 .d.ts文件问题
  • Numpy常见bug
  • 定时器的定义
  • linux用户组和用户
  • MyBatis复杂查询——一对一、一对多
  • AF3 FeaturePipeline类解读
  • 经典动态规划问题:爬楼梯的多种解法详解
  • 基于大模型的知识图谱搜索的五大核心优势
  • 每日c/c++题 备战蓝桥杯(二分答案模版)
  • 函数指针在C++遍历函数中的写法和应用(直接在函数中定义函数指针)。
  • Python调用手机摄像头检测火焰烟雾的三种方法
  • python定时调度升级