C语言操作符详解(上)

news/2024/11/29 12:54:22/

C语言操作符详解(上)

  • 前言
  • 1. 算术操作符
  • 2. 移位操作符
    • 2.1 左移操作符(<<)
    • 2.2 右移操作符(>>
  • 3. 位操作符
    • 3.1 按位与(&
    • 3.2 按位或(|
    • 3.4 按位异或(^
    • 3.5 一道变态的面试题
  • 4. 关系操作符
  • 5. 单目操作符
    • 单目操作符介绍:
    • 5.1 单目操作符(!
    • 5.2 单目操作符(~
    • 5.3 单目操作符(&、*
    • 5.4 单目操作符(++、--
    • 5.5 单目操作符(sizeof)和数组
  • 6. 结尾

前言

在C语言中,C标准提供了丰富的操作符,被用来对数据进行操作和计算,常用数学计算、比较、逻辑运算等操作。操作符是编程语言中非常重要的一部分,它们可以使程序更加简洁、高效,同时也可以增强代码的可读性和可维护性。本文将详细系统介绍C语言操作符,希望能帮读者全面理解C语言操作符!

1. 算术操作符

算术操作符分为以下5种,虽然简单,但还是有一些细节需要注意。

+)、(-)、(*)、(/)、(%

  • 除了%(取余)操作符之外,其他几个操作符可以作用于整数和浮点数。
  • 对于/操作符,如果两个操作数都为整数,执行整数除法。而只要有一个浮点数就执行浮点数除法。
  • %操作符的两个操作数必须为整数。返回的是整除之后的余数。

2. 移位操作符

在C语言中,移位操作符分为以下两种

  • <<左移操作符
  • >>右移操作符

相关知识补充:

#include <stdio.h>
int main()
{int a = 15;//00000000000000000000000000001111 - 原码//00000000000000000000000000001111 - 反码//00000000000000000000000000001111 - 补码int b = -15;//10000000000000000000000000001111 - 原码//11111111111111111111111111110000 - 反码//11111111111111111111111111110001 - 补码return 0;
}

Tips:

  • 位移操作符的操作数只能是整数。
  • 计算机能处理的是二进制的信息。而整数的二进制表示形式分为三种:原码、反码、补码。
  • 正整数的原码、反码、补码是相同的。负整数的反码是原码符号位不变,其他未按位取反、反码在加1就得到补码。

2.1 左移操作符(<<)

移位规则:

左边抛弃、右边补0

例子:

#include <stdio.h>
int main()
{int a = 15;//00000000000000000000000000001111 - (a)补码int b = a << 1;//对a的补码右移一位得到b的补码,左边抛弃,右边补0//00000000000000000000000000011110 - (b)补码//00000000000000000000000000011110 - (b)反码//00000000000000000000000000011110 - (b)原码printf("b=%d\n", b); //b得值为:30return 0;
}

2.2 右移操作符(>>

移位规则:

C语言中,右移运算分为两种:

  1. 逻辑右移:左边用0填充,右边丢弃。
    2. 算术右移:左边用原该值的符号位填充,右边丢弃。

上述两种运算方式,C语言没有明确规定到底是算术右移还是逻辑右移。但一般编译器上采用的是算术右移。
例子:

int main()
{int a = -15;//10000000000000000000000000001111 - 原码//11111111111111111111111111110000 - 反码//11111111111111111111111111110001 - 补码int b = a >> 1;//左边用原该值的符号位填充,右边丢弃//11111111111111111111111111111000 - 补码//11111111111111111111111111110111 - 反码//10000000000000000000000000001000 - 原码printf("b=%d\n", b); //b的值为:-8return 0;
}

警告:
对于移位运算符,不要移动负位数,这个行为C标准未定义的。

int num=10;
num>>-1; //error

3. 位操作符

在C语言中,位操作符有以下三种:&(按位与)、|(按位或)、^(按位异或)。
Tips:位操作符的操作数必须是整数,同时也是操作二进制位的。

3.1 按位与(&

& — 补码对应的二进制位有0则为0,两个同时为1才是1.

例子:

int main()
{int a = 3;//00000000000000000000000000000011 - 补码int b = -5;//10000000000000000000000000000101 - 原码//11111111111111111111111111111010 - 反码//11111111111111111111111111111011 - 补码int c = a & b;//&补码对应的二进制位有0则为0,两个同时为1才是1.//00000000000000000000000000000011 - 补码(a)//11111111111111111111111111111011 - 补码(b)//00000000000000000000000000000011 - 补码(c)printf("c=%d\n", c); //c的值为:3return 0;
}

3.2 按位或(|

| — 补码对应的二进制位有1则为1,两个同时为0才是0.

例子:

int main()
{int a = 3;//00000000000000000000000000000011 - 补码int b = -5;//10000000000000000000000000000101 - 原码//11111111111111111111111111111010 - 反码//11111111111111111111111111111011 - 补码int c = a | b;//&补码对应的二进制位有1则w为1,两个同时为0才是0.//00000000000000000000000000000011 - 补码(a)//11111111111111111111111111111011 - 补码(b)//11111111111111111111111111111011 - 补码(c)//11111111111111111111111111111010 - 反码(c)//10000000000000000000000000000101 - 原码(c)printf("c=%d\n", c);//c的值为:-5return 0;
}

3.4 按位异或(^

|^— 补码对应的二进制位不相同则为1,两个相同则为0.

int main()
{int a = 3;//00000000000000000000000000000011 - 补码int b = -5;//10000000000000000000000000000101 - 原码//11111111111111111111111111111010 - 反码//11111111111111111111111111111011 - 补码int c = a ^ b;//^ 补码对应的二进制位不相同则为1,两个同时为1或0时才是0.//00000000000000000000000000000011 - 补码(a)//11111111111111111111111111111011 - 补码(b)//11111111111111111111111111111000 - 补码(c)//11111111111111111111111111110111 - 反码(c)//10000000000000000000000000001000 - 原码(c)printf("c=%d\n", c);//c的值为:-8return 0;
}

3.5 一道变态的面试题

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

int main()
{int a = 10;int b = 20;//交换,按位异或是支持交换律的a = a ^ b;b = a ^ b;a = a ^ b;printf("a=%d b=%d\n", a, b);return 0;
}
  • 按位异或是支持交换律的。

4. 关系操作符

在这里插入图片描述
这些关系运算符比较简单,没什么可介绍的。

5. 单目操作符

单目操作符介绍:

在这里插入图片描述

5.1 单目操作符(!

(!)逻辑反操作,顾名思义就是把真变成假,把假变成真。

int main()
{int flag = 0;//下面两种判断flag为0就执行语句的方法,效果一样//方法1:if (flag == 0){//语句;}//方法2:flag为0,则为假。!a则为真,执行语句if (!flag){//语句;}return 0;
}

5.2 单目操作符(~

单目操作符(~)是按补码二进制位全部取反.(包括符号位)

例子:

int main()
{int a = 0;//00000000000000000000000000000000 - 补码int b = ~a;//~a--对a的补码全部取反//11111111111111111111111111111111 - 补码//11111111111111111111111111111110 - 补码//10000000000000000000000000000001 - 原码printf("%d\n", b); //b的值位:-1return 0;
}

5.3 单目操作符(&、*

单目操作符(&、*)都运用于指针。

int main()
{int a = 0;//pa是指针变量int* pa = &a; //&—取地址操作符—取出a的地址//解引用操作符(间接访问操作符)—通过pa中存放的地址,找到指向的空间(内容)*pa = 20;return 0;
}

5.4 单目操作符(++、–

单目单目操作符++- -),分为前置++- -)和后置++
前置++): 先++(- -),在使用。
后置++): 先使用,在++(- -)。

例子1:

int main()
{int a = 2;int b = --a; //前置--,先--,在使用//a=a-1,b=aprintf("a=%d b=%d\n", a, b);//a,b的值都为:1	return 0;
}

例子2:

int main()
{int a = 2;int b = a--; //后置--,先使用,在--//b=a,a=a-1printf("a=%d b=%d\n", a, b);//a的值为1,b的值为2return 0;
}

前置++和后置++同理。

5.5 单目操作符(sizeof)和数组

单目操作符(sizrof)用于计算操作数的类型长度。(单位字节)

#include <stdio.h>
void test1(int arr[])
{printf("%d\n", sizeof(arr));
}void test2(char ch[])
{printf("%d\n", sizeof(ch));
}
int main()
{int arr[10] = { 0 };char ch[10] = { 0 };printf("%d\n", sizeof(arr));//10X4printf("%d\n", sizeof(ch)); //10X1test1(arr);test2(ch);return 0;
}

运行结果(x64环境下):
在这里插入图片描述
上述前两个结果毋庸置疑,但为什么后两个都是8byte呢?
上面调用函数test1()和test2(),传过去的是指针。C语言中,在64位机器上(x64),指针大小为8byte;在32位机器上(x86)上,指针大小为4byte.

6. 结尾

本篇文章到此就结束了!创作不易,如果对你有帮助,记得点赞加关注哦!感谢您的支持,同时也欢迎读者发表自己的见解!


http://www.ppmy.cn/news/69814.html

相关文章

node笔记_koa框架的路由

文章目录 ⭐前言⭐koa 原生路由写法⭐引入 koa-router&#x1f496; 安装koa-router&#x1f496; 动态读取路径文件作为路由 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文介绍koa框架的路由。 往期文章 node_windows环境变量配置 node_npm发布包 linux_配置no…

Java面向对象程序设计实验报告(实验三 继承的练习)

✨作者&#xff1a;命运之光 ✨ 专栏&#xff1a;Java面向对象程序设计实验报告 ​ 目录 ✨一、需求设计 ✨二、概要设计 ✨三、详细设计 ✨四、调试结果 ✨五、测试结果 ✨附录&#xff1a;源程序代码&#xff08;带注释&#xff09; demo3类 Person类 Student类 …

RK3568平台开发系列讲解(调试篇)debugfs 分析手段

🚀返回专栏总目录 文章目录 一、enable debugfs二、debugfs API三、使用示例沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Linux 上有一些典型的问题分析手段,从这些基本的分析方法入手,你可以一步步判断出问题根因。这些分析手段,可以简单地归纳为下图: 从这…

CTFHub-ctfhub-Git泄露-Log

CTFHub-ctfhub-Git泄露-Log 当前大量开发人员使用git进行版本控制&#xff0c;对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。请尝试使用BugScanTeam的GitHack完成本题 1、dirsearch扫描 github上下载dirsearch-master 命令F…

某大学信息安全竞赛——栈迁移加强版——只溢出0x8,无限ROP

芝士题目&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1uwFlcSg94MuC2tPi-HCb9w 提取码&#xff1a;joj6 感悟&#xff1a; 之前我只做过溢出超过0x10这样的栈迁移&#xff0c;思路就是找机会去泄露栈空间的地址然后把栈迁移到我们可以控制的栈空间&#xff0c;亦…

【vimsolo】让vim看起来像VSCode:颜色主题和状态栏的配置

文章目录 1. 目的2. 理念&#xff1a; vimsolo3. vimrc: 配置颜色4. vimrc: 配置状态栏5. 拷贝颜色主题和.vimrc: python安装脚本 1. 目的 习惯了 VSCode 默认的配色&#xff1a;黑色主题&#xff0c;蓝色状态栏。偶尔使用 Vim 时想让 vim 伪装的像 VSCode&#xff0c;不考虑花…

Verilog语法概述二:何为仿真?仿真可以在几个层面上进行?

Verilog 是一种用于数字逻辑电路设计的硬件描述语言&#xff0c;可以用来进行数字电路的仿真验证、时序分析、逻辑综合。 既是一种行为级&#xff08;可用于电路的功能描述&#xff09;描述语言又是一种结构性&#xff08;可用于元器件及其之间的连接&#xff09;描述语言。 …

方差分析 python中运行stata

方差分析 文章目录 方差分析[toc]1 单因素方差分析2 多因素方差分析 # 配置stata17在jupyter 配置 import stata_setup stata_setup.config(r"D:\Stata17\setup",se)1 单因素方差分析 from pystata import stata # 查看单因素方差分析命令介绍 stata.run("help…