操作符这块,你可得把握住(下)

简介: 操作符这块,你可得把握住(下)

~ 按位取反操作符

对二进制序列进行取反
复制代码

如:

int main()
{
    int a = 1;
    int b = 0;
    b = ~a;
    printf("%d\n",b); //-2
}
//a : 00000000 00000000 00000000 00000001
 ~a:  11111111 11111111 11111111 11111110 -补码
     符号位为1,负数
     要转化为原码,%d打印的是原码
 对补码求补码就是原码
   11111111 11111111 11111111 11111110 -补码
   10000000 00000000 00000000 00000001 -反码符号位不变其他位按位取反
    10000000 00000000 00000000 00000010 - 反码+1 
     ->值为-2
复制代码


6.程序题:如何把二进制序列某一位为0的翻转1


或运算:某一位或上0,对应的位不翻转。

某一位或上1,如果该位为1,不翻转。如果为0,翻转

方法:使某一位二进制数翻转为1,就或上其他为0,只有对应该位的二进制为1的数


image.png

//使0的某一位翻转  
int main()
{
    int a = 0;
    int n = 0;
    scanf("%d",&n); //第几位翻转
    int b = a | (1 << (n-1));
    printf("%d对应二进制序列第%d位翻转的结果为%d\n",a,n,b);
    return 0;
}
复制代码


想要第n个二进制位变成1  只需要 按位或(|)上 1<



7,程序题,如何把二进制序列某一位为1的翻转0


方法: 1左移n-1位的数按位取反  再与上该数即可

image.png

int main()
{
    int a = 15; //0000 1111
    //使第三(第n)位翻转为0
    a &= ~(1<<2);
    printf("%d\n",a);//11 0000 1011
    return 0;
}
复制代码

以8bit为例子


1左移0位:0000 0001


1左移1位:0000 0010


int main()
{
    int a =13;  //0000 1101
    a |=(1<<1); //相当于 a = a|(1<<1) 即使a二进制序列第二位翻转为1
    printf("%d\n",a);//0000 1111  -15
    //恢复
    a &=(~(1<<1));  //a = a&(~(1<<1))  即使a的二进制序列第二位翻转为0  
    printf("%d\n",a);//0000 1101 -13
    return 0;
}
复制代码


&& ||  逻辑与  逻辑或

C语言中0表示假,非0表示真



&&发生短路现象:

A&&B&&C   当A,B,C同时为真时,结果才为真  
 A,B,C中有一个为假(0)了,就终止后序计算
复制代码
int main()
{
    int a =0;
    int b = 1;
    int c = 1;
    int d = a++ && b++ && c++;
    printf("%d %d %d %d\n",a,b,c,d);//1 1 1 0
    //原因:a++为后置++,先使用a的值,为0,直接终止运算,然后a的值变成1,后续的i表达式不执行
    return 0;
}
复制代码


||发生短路现象:


A || B || C   A,B,C只要有一个为真,结果就为真
    A,B,C中有一个为真(非0为真)了,就终止后序计算
复制代码

int main()
{
    int a = 0;
    int b = 1;
    int c = 1;
    int d = a++ || b++ || c++;
    printf("%d %d %d %d\n", a, b, c, d);//1 2 1 1
    ///原因:a++为后置++,先使用a的值,为0,b++,后置++,先使用b的值,b为1,条件为真,终止后序运算, 然后a++变成1,b++变成2 
    return 0;
}
复制代码


唯一的三目操作符   ? :


P? A:B ;   
如果P为真,执行A,否则执行B
如:C= A > B? A:B;  ->求两个数的最大值 如果A>B为真。C = A,否则C = B
复制代码


逗号表达式

逗号表达式的结果为最后一个式子


int main()
{
    int a = 1;
    int b = 3;
    int c = 0;
   // c =a++, b++, a + 1;
    //printf("%d %d %d\n",a,b, c);  // 2 4 1 并不是2 4 3
    //原因:赋值表达式= 优先级比逗号表达式高,所以相当于c=a++,然后再执行后面的表达式 
    //正解
    c = (a++, b++, a + 1);
    printf("%d %d %d\n",a,b, c);  //2 4 3
    return 0;
}
复制代码

a = get_val();
count_vao(a);
while(a>0)
{
    //处理
    a = get_val;
    count_val(a);
}
复制代码

--->上面的表达式也可以用逗号表达式

while(a = get_val(),count_val(a),a > 0)
{
    //处理
}
复制代码


[] 操作符


int main()
{
    int arr[] = {1,2,3,4,5};
    int i = 0;
    for(i = 0;i < 5;i ++)
    {
        printf("%p----%p\n",&arr[i],arr+i);
    }
    return 0;
}
复制代码

image.png


数组名是首元素地址,所以 arr+i: 下标为i的元素的地址


arr[4] :[]是操作符,arr和4是它的两个操作数
arr[4]  ==  *(arr+4) 加法支持交换律 ->  *(4+arr)  ->4[arr]
arr[4] 和*(arr+4)对于  所以*(4+arr) -->对于4[arr]
复制代码

再一次说明[]是操作符 arr和4是操作数而已


():函数调用操作符

如:

strlen() 函数:返回的是无符号整形


// /0  不算进字符串长度
printf("%d\n",strlen("abc"));//3  
printf("%u\n",strlen("abc"));//3
复制代码

对于函数调用操作符 ()

接收一个或者多个操作数,第一个操作数是函数名,剩余的操作数就是传递给函数的参数


如: my_Add(a,b)  ()有3个操作数为   my_Add (函数名) a , b


结构体成员访问操作符 -> .

创建结构体类型本身不占用内存空间,创建结构体变量时才开辟空间

struct Stu
{
  int age;  //结构体成员
  char name[20];  //结构体成员
}s1,s2;
struct Stu s3;
//struct Stu是结构体类型
// s1,s2为结构体全局变量
// s3为结构体局部变量
复制代码

struct Stu
{
  int age;
  char name[20];
};
int main()
{
  struct Stu s[3] = { {20,"zhangsan"} ,{30,"lemon"} ,{10,"shuai"} };
  int i = 0;
  //方法1:结构体变量用.访问
  for (i = 0; i < 3; i++)
  {
    printf("%d %s\n", s[i].age, s[i].name);
  }
  //方法2:结构体指针用->访问  
  struct Stu* p = &s[0];
  printf("%d %s\n", p->age,p->name);
  //方法3:解引用结构体访问
  printf("%d %s\n", (*p).age, (*p).name);
  return 0;
}
复制代码

注意事项:

不可以直接把字符串放进结构体里面的数组中。要使用strcpy函数

#include<string.h>
int main()
{
  struct Stu
  {
    int age;
    char name[20];
  };
  struct Stu s;
  s.age = 10; 
  //s.name = "mango"; //err,name是数组名,是常量地址,应该把要改的字符串放到name指向的空间里
  //正解 -字符串拷贝函数strcpy()
  strcpy(s.name, "数据结构");
  printf("%d %s\n", s.age, s.name);
}
复制代码

总结:
   结构成员访问操作符
方法1:    结构体变量.成员名
方法2:    结构体指针->成员名
方法3:    (*结构体指针).成员名
复制代码

6.整形提升

当计算的两个操作数的类型为short或者char,会发生整形提升,提升为int


7.算术转化

大于4个字节的类型变量进行计算,发生的是算术变化,往高字节的类型转化,最后的结果类型为参加计算的变量类型中字节最大的。

例如:

int a = 0;
float b = 0.0f; //C语言的小数默认是double类型,如果想为float类型,就在初始值后面加f
double c = 0.0;
d = a+b+c;
问:d是什么类型?
   -》往高字节转化,最后结果为字节数最大的类型
   字节:double 8byte
      int 4 byte
      float 4byte
    所以d为double类型
复制代码




相关文章
|
SQL 安全 网络协议
常用和不常用端口一览表收藏
大家在学习计算机的时候,对于最常用的几个端口比如80端口肯定有很深的印象,但是对于其他一些不是那么常用的端口可能就没那么了解。所以,在一些使用频率相对较高的端口上,很容易会引发一些由于陌生而出现的错误,或者被黑客利用某些端口进行入侵。
4908 0
|
9月前
|
传感器 人工智能 算法
银行业智慧转型:服务机器人核心技术解析与主流产品选型指南
银行服务机器人正从“玩具”迈向“数字员工”,依赖垂直大模型+RAG、多传感器SLAM导航、Agentic AI任务拆解及隐私计算等核心技术。猎户星空全栈自研均衡全面,优必选拟人交互突出,科大讯飞语音领先,云迹科技专精物流配送。选型需匹配场景与转型需求。(238字)
588 5
|
3月前
|
人工智能 安全 算法
大模型应用:AI 智能体核心引擎:RAG检索增强生成原理与医疗场景深度落地.126
本文详解RAG(检索增强生成)在医疗智能体中的落地实践:针对大模型知识过时、幻觉、专业性不足三大痛点,基于Qwen本地大模型、MiniLM嵌入、FAISS向量库与LangChain框架,实现全流程可追溯、全本地化、无幻觉的精准问答。含环境配置、适配器封装、知识库构建及调试分析。
499 7
|
5月前
|
人工智能 运维 机器人
保姆级图文教程|阿里云轻量服务器部署OpenClaw、Discord集成与千问Qwen3.6-Plus全配置指南
本文完整覆盖从**轻量服务器实例创建、端口放行、OpenClaw初始化、Discord深度集成、大模型API配置、技能扩展、运维排错**的全流程,所有步骤均为2026年4月最新实践,配合详细的避坑指南与运维命令,可解决新手部署中90%以上的问题。遵循**“选对海外地域、放通核心端口、准确配置凭证、及时重启服务、使用专用小号”**五大核心原则,即可实现OpenClaw 7×24小时稳定运行,通过Discord随时随地与专属AI助理交互,高效完成社群管理、内容创作、代码编写、信息查询等各类任务,快速落地AI智能化应用场景,让AI真正成为个人与团队的高效生产力工具。
899 4
|
5月前
|
弹性计算 安全 Linux
零基础实战:阿里云ECS云服务器OpenClaw(Clawdbot)部署+本地系统搭建+大模型API对接指南
2026年,OpenClaw(原Clawdbot)作为轻量化开源AI代理框架,凭借跨平台兼容、大模型无缝集成、多场景自动化能力,成为个人与小型团队搭建智能助手的首选方案。本文完整覆盖2026年阿里云轻量服务器部署及本地MacOS/Linux/Windows11部署OpenClaw(Clawdbot)步骤流程及阿里云千问大模型API配置或市场上免费大模型Coding Plan API配置及常见问题解答,以阿里云ECS云服务器为核心部署方案,同步补充本地全平台搭建方法,所有代码命令可直接复制,全程无复杂操作,新手也能一次成功落地。
761 1
|
7月前
|
数据可视化 关系型数据库 MySQL
PhpStudy2018怎么用?完整安装与使用指南(新手必看)
PhpStudy2018是一款Windows下PHP集成开发环境,一键安装Apache、MySQL、PHP,免去逐个配置的麻烦。支持多版本PHP切换、可视化服务管理,根目录(WWW)即放即用,适合初学者学习与本地网站调试。(239字)
|
监控 供应链 API
1688商品列表API全参数指南:从基础搜索到高级筛选
1688商品列表API是阿里巴巴B2B平台的核心接口,支持关键词搜索、高级筛选、排序与分页功能,适用于选品、价格监控等场景。数据规范、稳定高效,日均调用量大。提供Python示例代码,便于快速接入与扩展应用。
|
前端开发
React给antd中TreeSelect组件左侧加自定义图标icon
本文介绍了如何在React中为Ant Design的TreeSelect组件的每个树节点添加自定义图标,并解决了因缺少key属性而导致的警告问题,展示了如何通过递归函数处理treeData数据并为每个节点添加图标。
1011 2
React给antd中TreeSelect组件左侧加自定义图标icon
|
消息中间件 监控 前端开发
什么时候会使用WebSockets?如何使用Spring Boot实现?
什么时候会使用WebSockets?如何使用Spring Boot实现?
804 6
|
数据采集 存储 Apache
Flume核心组件大揭秘:Agent、Source、Channel、Sink,一文掌握数据采集精髓!
【8月更文挑战第24天】Flume是Apache旗下的一款顶级服务工具,专为大规模日志数据的收集、聚合与传输而设计。其架构基于几个核心组件:Agent、Source、Channel及Sink。Agent作为基础执行单元,整合Source(数据采集)、Channel(数据暂存)与Sink(数据传输)。本文通过实例深入剖析各组件功能与配置,包括Avro、Exec及Spooling Directory等多种Source类型,Memory与File Channel方案以及HDFS、Avro和Logger等Sink选项,旨在提供全面的Flume应用指南。
1894 1

热门文章

最新文章