C- 符号

news2025/1/16 1:48:35

文章目录

    • 符号
        • `#ifdef-#endif`
        • \
          • 接续符
          • 转义
            • 旋转光标
            • 数字倒计时
        • 单引号-双引号
        • 逻辑运算符&& ||
          • 短路
        • 位运算符
          • 异或
          • 位运算最好使用定义好的宏
          • 左移右移
        • ++
          • 后置++
          • 前置++
          • 复杂表达式
        • 取整
          • 0向取整(C中默认取整方式)
          • floor地板取整
          • ceil
          • round 四舍五入
        • 取模
          • 取余和取模一样吗?
        • 运算符优先级

符号

#ifdef-#endif

基于条件编译,代码编译期间处理 gcc -E test1.c -o test.i,生成预处理之后的.i文件查看宏替换,注释去掉的情况.

  • #ifdef-#endif

image-20230412144011453

image-20230412144217157

  • #if-#endif表达式是否为1

image-20230412144459359

\

接续符
  • 使用\之后,后面不要有任何字符,包括空格.
int main()
{
    int a = 1;
    int b = 2;
    int c = 3;
    //试试在\之后带上空格,行不行?
    //试试在\之前带上空格,行不行?
    //建议:不要带
    if (a == 1 &&\
        b == 2 &&\
        c == 3){
        printf("hello world!\n");
    } 
    system("pause");
    return 0;
}
转义
int main()
{
	printf("\""); //特殊转字面
	printf("\n");//字面转特殊
	return 0;
}
  • 回车\r:光标回到当前行的位置

  • 换行\n:光标移动到下一行

旋转光标
int main()
{
	const char* lable = "|/-\\";
	int index = 0;
	while (1)
	{
		index %= 4;
		printf("[%c]\r",lable[index]);
		index++;
		Sleep(300);
	}
}
数字倒计时
int main()
{
	int i = 15;
	for (; i >= 0; i--)
	{
		printf("[%2d]\r",i);
		Sleep(1000);
	}
}

单引号-双引号

变量是帮助我们操纵字面值常量运算的.

  • 不同的语言识别’'的字符常量是不一样的.

image-20230412154456215

  • 为什么这么写也中?

因为C识别’'时就开辟的四字节空间.但是存的只有一个字节.

int main()
{
	//char c1 = 'abscd';//error
	char c2 = 'abcd';
    printf("%c\n",c2);//d
}

逻辑运算符&& ||

短路

当前面的条件成立时执行后面的代码

int show()
{
    printf("you can see me!\n");
    return 1;
} 
int main()
{
    int a = 0;
    scanf("%d", &a);
    a == 10 && show();
    system("pause");
    return 0;
}

位运算符

int main()
{
	printf("%d\n", 2 | 3); //3
	printf("%d\n", 2 & 3); //2
	printf("%d\n", 2 ^ 3); //1
	printf("%d\n", ~0); //-1 按位取反符号位是参与运算的
	system("pause");
	return 0;
}
异或

任何数字和0异或都是他本身,和自己异或都是0.支持交换律和结合律.

  • 交换值(不存在相加进位导致类型溢出的问题)
int main()
{
	int a = 10;
	int b = 20;
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("%d %d\n",a,b);
	system("pause");
}
位运算最好使用定义好的宏
#define SETBIT(x,n) x|=(1<<(n-1))//注意赋值操作
#define RESTBIT(x,n) x&=(~(1<<(n-1)))
void ShowBit(int x)
{
	int num = sizeof(x)*8-1;
	while (num>=0)
	{
		if (x & (1<<num))
		{
			printf("1");
		}
		else
		{
			printf("0");
		}
		num--;
	}
	printf("\n");
}
int main()
{
	int x = 0;
	//设置指定比特位是1
	SETBIT(x,5);
	//显示int的所有比特位
	ShowBit(x);
}
  • 整形提升(不同的编译器方式不同)

image-20230413113542390

在编译期间就已经处理好了,被硬编译为数字.

无论任何位运算符,目标都是要计算机进行计算的,而计算机中只有CPU具有运算能力(先这样简单理解),但计算的数据,都在内存中。

故,计算之前(无论任何运算),都必须将数据从内存拿到CPU中,拿到CPU哪里呢?毫无疑问,在CPU 寄存器中。而寄存器本身,随着计算机位数的不同,寄存器的位数也不同。一般,在32位下,寄存器的位数是32位。

可是,你的char类型数据,只有8比特位。读到寄存器中,只能填补低8位,那么高24位呢?就需要进行“整形提升”。

左移右移
<<(左移): 最高位丢弃,最低位补零
>>(右移):
1. 无符号数:最低位丢弃,最高位补零[逻辑右移](2倍操作)
2. 有符号数:最低位丢弃,最高位补符号位[算术右移]  
补0还是1跟数据是没有关系的,数据正负都需要转化为补码写入内存
向外读取进行补0 or 1是看数据类型的,无符号就补0,有符号就具体来.

image-20230413115751037

丢弃基本理解链:
<< 或者 >> 都是计算,都要在CPU中进行,可是参与移动的变量,是在内存中的。所以需要先把数据移动到CPU内寄存器中,在进行移动。
那么,在实际移动的过程中,是在寄存器中进行的,即大小固定的单位内。那么,左移右移一定会有位置跑到"外边"的情况

++

后置++

image-20230416143445486

前置++

image-20230416143643489

如果没人用于赋值使用,前置和后置没有区别.

  • 初始化有一条汇编语句,赋值是两条汇编语句.
复杂表达式

在不同的编译器中,因为表达式的计算路径不唯一(编译器识别表达式是同时加载到寄存器还是分批加载,时不确定的)导致的.

相同的一份代码:

int main()
{
	int i = 1;
	int j = (++i) + (++i) + (++i);
	printf("%d\n",j);
}

vs环境下:

image-20230416144702342

Linux 环境下:

image-20230416145452687

  • 表达式匹配的规则是贪心算法(根据空格的划分)
int main()
{
	int a = 10;
	int b = 20;
	printf("%d\n",a++ + ++b);//31
}

取整

0向取整(C中默认取整方式)
int main()
{
	//本质是向0取整
	int i = -2.9;
	int j = 2.9;
	printf("%d\n", i); //结果是:-2
	printf("%d\n", j); //结果是:2
	system("pause");
	return 0;
}

image-20230416150821119

floor地板取整

朝向负无穷大取整.-∞

//demo 2
#include <stdio.h>
#include <math.h> //因为使用了floor函数,需要添加该头文件
#include <windows.h>
int main()
{
    //本质是向-∞取整,注意输出格式要不然看不到结果
    printf("%.1f\n", floor(-2.9)); //-3
    printf("%.1f\n", floor(-2.1)); //-3
    printf("%.1f\n", floor(2.9)); //2
    printf("%.1f\n", floor(2.1)); //2
    system("pause");
    return 0;
}
ceil
#include <stdio.h>
#include <math.h>
#include <windows.h>
int main()
{
    //本质是向+∞取整,注意输出格式要不然看不到结果
    printf("%.1f\n", ceil(-2.9)); //-2
    printf("%.1f\n", ceil(-2.1)); //-2
    printf("%.1f\n", ceil(2.9)); //3
    printf("%.1f\n", ceil(2.1)); //3
    system("pause");
    return 0;
}
round 四舍五入
#include <stdio.h>
#include <math.h>
#include <windows.h>
int main()
{
    //本质是四舍五入
    printf("%.1f\n", round(2.1));
    printf("%.1f\n", round(2.9));
    printf("%.1f\n", round(-2.1));
    printf("%.1f\n", round(-2.9));
    system("pause");
    return 0;
}

取模

取模概念:

如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r 且0 ≤ r < d。其中,q被称为商,r 被称为余数.

image-20230416154619912

故,大家对取模有了一个修订版的定义:
如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r , q 为整数,且0|r|
< |d|。其中,q 被称为商,r 被称为余数。
有了这个新的定义,那么C中或者Python中的“取模”,就都能解释了。
解释C: -10 = (-3) * 3 + (-1)
解释Python:-10 = (?)* 3 + 2,其中,可以推到出来,'?'必须是-4(后面验证).-10 =-4* 3 + 2,才能满足定义。注意:python中 / 默认是浮点数除法,// 才是整数除法,并进行-∞取整
所以,在不同语言,同一个计算表达式,负数“取模”结果是不同的。我们可以称之为分别叫做正余数 和 负余数.  

由上面的例子可以看出,具体余数r的大小,本质是取决于商q的。而商,又取决谁呢?取决于除法计算的时候,取整规则 .

取余和取模一样吗?
  • 本质 1 取整:

取余:尽可能让商,进行向0取整。
取模:尽可能让商,向-∞方向取整。
故:
C中%,本质其实是取余。
Python中%,本质其实是取模。(后面不考虑python,减少难度)
理解链:

  • 对任何一个大于0的数,对其进行0向取整和-∞取整,取整方向是一致的。故取模等价于取余

  • 对任何一个小于0的数,对其进行0向取整和-∞取整,取整方向是相反的。故取模不等价于取余

同符号数据相除,得到的商,一定是正数(正数vs正整数),即大于0!
故,在对其商进行取整的时候,取模等价于取余。

  • 本质 2 符号:参与取余的两个数据,如果同符号,取模等价于取余
int main()
{
	printf("%d\n", -10 / 3); //结果:-3
	printf("%d\n\n", -10 % 3); //结果:-1 为什么? -10=(-3)*3+(-1)
	printf("%d\n", 10 / -3); //结果:-3
	printf("%d\n\n", 10 % -3); //结果:1 为什么?10=(-3)*(-3)+1
	system("pause");
	return 0;
}
//如果不同符号,余数的求法,参考之前定义。C等向0取整的语言,余数符号,与被除数相同

结论:如果参与取余的两个数据符号不同,在C语言中(或者其他采用向0取整的语言如:C++,Java),余数符号,与被除数相同。

参与取余的两个数据,如果同符号,取模等价于取余

  • 推导
如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r , q 为整数,且0 ≤ |r|< |d|。其中,q 被称为商,r 被称为余数。
a = q*d + r 变换成 r = a - q*d 变换成 r = a + (-q*d)
对于:x = y + z,这样的表达式,x的符号 与 |y||z|中大的数据一致
而r = a + (-q*d)中,|a||-q*d|的绝对值谁大,取决于商q的取整方式。
c是向0取整的,也就是q本身的绝对值是减小的。
如:
-10/3=-3.333.33 向0取整 -3. a=-10 |10|, -q*d=-(-3)*3=9
10/-3=-3.333.33 向0取整 -3. a=10 |10|, -q*d=-(-3)*(-3)=-9  q*d 变小了
python是向-∞取整的,也就是q本身的绝对值是增大的。
-10/3=-3.333.33 '//'向-∞取整 -4. a=-10 |10|, -q*d=-(-4)*3=12 |12|
10/-3=--3.333.33 '//'向-∞取整 -4. a=10 |10|, -q*d=-(-4)*(-3)=-12 |12|
绝对值都变大了,-10+12>0,就和被除数符号不同了.
int main()
{
	printf("%d\n", 5 / (-2)); //-2
	printf("%d\n", 5 % (-2)); //5=(-2)*(-2)+1
	system("pause");
	return 0;
}

运算符优先级

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

两小时让你全方位的认识文件(一)

想必友友们在生活中经常会使用到各种各样的文件&#xff0c;那么我们是否了解它其中的奥秘呢&#xff0c;今天阿博就带领友友们深入地走入文件&#x1f6e9;️&#x1f6e9;️&#x1f6e9;️ 文章目录 一.为什么使用文件二.什么是文件三.文件的打开和关闭四.文件的顺序读写 一…

网页自动化工具DrissionPage

逛Github时偶然看到的开源项目&#xff0c;DrissionPage是一款新的基于 python 的网页自动化工具。 笔者已测试过&#xff0c;给大家推荐下。 项目地址&#xff1a;https://gitee.com/g1879/DrissionPage 安装测试 安装命令 pip install DrissionPage测试 from Drissio…

unity | 处理string常用的知识(持续更新)

一、转义字符和的用法 1.常规用法 我们现在有一行字&#xff0c;但是我对它的格式之类的有要求 例&#xff1a;天无绝人之路&#xff0c;条条道路通罗马。 我想打成&#xff1a; 天无绝人之路&#xff0c; 条条道路通罗马。 换行前&#xff0c;写法是&#xff1a; string s …

科海思—美国杜笙Tulsimer中国区总代理,制糖脱色树脂A-722

一、产品介绍 具有控制孔径的大孔强碱性Ⅰ型阴特种脱色用离子交换树脂 Tulsimer A-722是一款具有便于颜色和有机物去除的控制孔径的&#xff0c;专门开发的大孔强碱性Ⅰ型阴离子交换树脂。 Tulsimer A-722 &#xff08;氯型&#xff09;专门应用于糖浆脱色。 Tulsimer A…

Python学习简记

常用数据类型 整数类型int 二进制以0b开头八进制以0o开头十六进制以0x开头 这里还有一个值得注意的点&#xff1a;python中的整型是“无限长”的&#xff0c;因此它可以表示任何数 浮点数 python中只有float作为浮点数&#xff0c;没有double 主要注意python中对浮点数与Decima…

Spring系统架构与主要概念

Spring系统架构与主要概念 Spring Framework系统架构Core Container 核心容器AOP 层数据层Web层测试层 业务逻辑Spring之前遇到的问题解决方案 Spring核心概念IOC&#xff08;Inversion of Control&#xff09;控制反转DI&#xff08;Dependency Injection&#xff09;依赖注入…

SRv6实践项目(四):基于YANG的配置下发

在本章节&#xff0c;主要是了解YANG是什么&#xff0c;以及基于YANG下发配置的工作原理&#xff1a; 1.什么是YANG 在介绍之前&#xff0c;为了给大家一个最直观的感受&#xff0c;我们打开yang工具&#xff0c;它被打包成一个容器了&#xff0c;可以轻松的使用&#xff0c;…

完美解决丨1. **`SyntaxError: invalid syntax`**

SyntaxError: invalid syntax 因为没有符合语法要求&#xff0c;导致报错。 解决办法&#xff1a; 语法错误的原因主要是代码的风格&#xff0c;例如&#xff1a; 左括号或者右括号没有配对&#xff1b;左括号或者右括号没有放在语句的正确位置&#xff1b;缺少冒号&#xff1…

Window10下安装DPDK

由于我装的是vs2019&#xff0c;打开Visual Studio Installer&#xff0c;在可选下&#xff0c;选择Windows 10 SDK&#xff0c;点击修改。 右键此电脑属性&#xff0c;查看Windows10版本。 安装WDK&#xff0c;打开网址https://learn.microsoft.com/zh-cn/windows-hardware/…

计算机系统-链接

例行前言&#xff1a; 本篇不是学习课程时的笔记&#xff0c;是重看这本书时的简记。对于学习本课程的同学&#xff0c;未涉及的内容不代表考试不涉及&#xff0c;部分省略的部分是在该课程的讨论课中学习的(PIC&#xff0c;放出了我在讨论课中的PPT作为参考)&#xff0c;核心…

Sentinel使用

文章目录 一. 初识Sentinel1. 雪崩问题及解决方案2. 服务保护技术对比3. Sentinel介绍和安装4. 微服务整合Sentinel 二. 限流规则1. 快速入门2. 流控模式3. 流控效果4. 热点参数限流 三. 隔离与降级—调用方保护方案1. FeignClinet整合sentinel2. 线程隔离&#xff08;舱壁模式…

vue3中的单文件组件<script setup>和setup函数区别 详解

文章目录 简介基本语法变量和方法多的使用注册组件动态组件使用外部文件方法组件通信props与defineProps、emitdefineEmitsdefineExpose 获取 attrs、slots 和useAttrs、useSlots 方法与普通的 < script > 一起使用v-bind() CSS变量注入style的新特性之global对await异步…

行业认可,知道创宇入选安全牛第十版全景图30个细分领域

近日&#xff0c;国内网络安全领域专业媒体安全牛正式发布了第十版《中国网络安全行业全景图》&#xff08;以下简称“全景图”&#xff09;&#xff0c;知道创宇凭借过硬的技术实力及成熟的市场应用获得行业认可&#xff0c;入围10项一级安全分类共计30项二级细分领域&#xf…

ASEMI代理ADI亚德诺AD8130ARZ-REEL7车规级芯片

编辑-Z AD8130ARZ-REEL7芯片参数&#xff1a; 型号&#xff1a;AD8130ARZ-REEL7 −3dB带宽&#xff1a;250MHz 0.1 dB平坦度的带宽&#xff1a;25MHz 斜率&#xff1a;930V/μs 建立时间&#xff1a;20ns 上升和下降时间&#xff1a;1.5ns 输出超速恢复&#xff1a;30n…

访学案例分享|经济学老师获英国两高校邀请函

D老师所在国内高校鼓励教职员工通过各种渠道公派或者自筹经费出国访学进修。在考虑了学校要求及个人条件后&#xff0c;其决定用自费方式赴英国访学。我们分别获得了英国利兹贝克特大学和邓迪大学的邀请函&#xff0c;最终D老师顺利过签&#xff0c;如期出国。 D老师背景&#…

网络编程【UDP数据报套接字编程】

目录 1.网络编程基础 1.1 为什么需要网络编程&#xff1f; 1.2 什么是网络编程 1.3 网络编程中的基本概念 2.Socket套接字 2.1 分类 3.UDP数据报套接字编程 3.1 DatagramSocket API 3.2 DatagramPacket API 3.3 基于 UDP socket 写一个简单的回显客户端服务器程序&am…

设计模式 -- 桥梁模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

自适应安全、主权云、超级自动化顶级政府技术趋势

根据分析公司 Gartner 的数据&#xff0c;自适应安全、主权云和超级自动化是 2023 年十大政府技术趋势之一。 确定了 2023 年的 10 大政府技术趋势&#xff0c;这些趋势可以指导公共部门领导者在为后数字化政府做准备和不懈地关注任务目标时加速转型。 当前的全球动荡和技术中…

9-2分布迭代次数的15个梯度

( A, B )---1*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有1个节点&#xff0c;AB训练各由11张二值化的图片组成&#xff0c;让A中有3个0&#xff0c;B中全是0&#xff0c;排列组合A的所有可能&#xff0c;统计迭代次数的顺序。 A-B 迭代次数 标准差 势能 标准差势能 11 …

30天学会《Streamlit》(6)

30学会《Streamlit》是一项编码挑战&#xff0c;旨在帮助您开始构建Streamlit应用程序。特别是&#xff0c;您将能够&#xff1a; 为构建Streamlit应用程序设置编码环境 构建您的第一个Streamlit应用程序 了解用于Streamlit应用程序的所有很棒的输入/输出小部件 第6天 - 使…