当前位置:网站首页>最强操作符学习之路(C语言详解)
最强操作符学习之路(C语言详解)
2022-04-22 06:15:00 【cxy_zjt】
索引:
int main() {
int a = 3;
int b = 2;
float c = 0.2;
int d = a / b;
int e = a % b;
printf("%d %d ", d, e);
return 0;
} 这段代码输出的应该是 1 1
这样写程序运行的很良好 但是如果这样

程序虽然不报错 但是会出现警告 实际上算出的浮点数 因为上述代码是非要把给结果f设置成int类型 这样如果数字大了 可能会造成精度丢失 这是一种不好的操作习惯 我们要避免
在讲下列操作符之前,我们得先知道一个概念,每个数字都有三个码——原码,反码,补码,数字在电脑中储存的二进制位都是该数字的补码 但是电脑上面显示的却是数字的原码
三者关系如下
以int类型整数为例,因为int是四个字节 32个比特位 所以由32位组成,最前面的一位是符号位,0为正,1为负
如果正数 eg:1 它的原码,反码,补码都是00000000000000000000000000000001
负数不一样 eg -2 原码:10000000000000000000000000000010
反码: 111111111111111111111111111111111101 除符号其他全部取反
补码: 111111111111111111111111111111111110 反码+1等于补码
下述操作符若无明显提示 那么电脑操作的就是补码
2.移位操作符
15的二进制位:
我们看看代码具体是怎么操作的

再看一个图加深一下理解

>> 右移操作符
第一个-1我用的是有符号整型 int
第二个-1我用的是无符号整型unsigned 区别很明显啦
在c语言中,!和~均表示取反,这两个的区别在于:
- ! :代表逻辑取反,即:把非0的数值变为0,0变为1;
- ~ :表示按位取反,即在数值的二进制表示方式上,将0变为1,将1变为0;
至于取地址& 与sizeof 我在这就不过多阐述了 在我之前的博客都有详解
还有一个就是前置++与后置++的问题了
个人理解:
前置++:先++后使用
后置++:先使用后++
减法也是一样的
int main() {
int a = 0;
int* p = &a;//那么这边p就是a的地址 *p代表的就是a
*p = 20;//*存在告诉编译器p是一个指针变量
printf("%d\n", a);
return 0;
}
强制类型转换算是C语言中常见常考的一项内容,如对于类型处理不好,将会产生错误结果。对于某些类型的转换编译器可隐式地自动进行,不需人工干预,称这种转换为自动类型转换;而有些类型转换需要编程者显式指定,通常,把这种类型转换称为强制类型转换
计算机硬件进行算术操作时,要求各操作数的类型具有相同的大小(存储位数)及存储方式。
int main() {
double a = 6.7;
int b = 2;
int c = b + (int)a;
printf("%d", c);
return 0;
}
表达式求值
总结:如果是在计算中小于int的类型计算机会先将其转换成int类型 在进行下面的计算,
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if (a == 0xb6)
printf("a");
if (b == 0xb600)
printf("b");
if (c == 0xb6000000)
printf("c");
return 0;
}
#include <stdio.h>
int main()
{
int i;
i = 10;
printf("%d\n", i);
printf("%d\n", sizeof(++i));
printf("%d\n", sizeof(i++));
printf("%d\n", i);
return 0;
}
输出:10 4 4 10
如果sizeof的操作数是一个表达式的话,这个表达式时不会被计算的。
sizeof当预处理看就行了,它后面括号里的东西,根本不求值,只根据C的一堆规则判断结果类型,然后返回结果类型的大小
上述我们了解到char类型和short类型需要转换成int 那么之后呢?——算数转换
int a = 9;
double c = 6.7;
b = a+c;//这边b的类型就是double 就理解为double的精度更高吧
当赋值运算符两边的运算对象类型不同时,将要发生类型转换, 转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。
如
double a = 2.5;
int b = a;//b的值为2 计算机自动省略小数点后面的数 但是这会造成精度丢失 不建议使用
现在我们拿到了数字类型都知道了 但是计算是还应该考虑一个东西

记忆方法:
记住一个最高的:构造类型的元素或成员以及小括号。
记住一个最低的:逗号运算符。
剩余的是一、二、三、赋值。
意思是单目、双目、三目和赋值运算符。
在诸多运算符中,又分为:
算术、关系、逻辑。
两种位操作运算符中,移位运算符在算术运算符后边,逻辑位运算符在逻辑运算符的前面。再细分如下:
算术运算符分 * , / , % 高于 + , - 。
关系运算符中,〉,〉 = , < , <= 高于 == ,! = 。
逻辑运算符中,除了逻辑求反(!)是单目外,逻辑与( && )高于逻辑或( || )。
逻辑位运算符中,除了逻辑按位求反(~)外,按位与(&)高于按位半加(^),高于按位或( | )。
这样就将15种优先级都记住了,再将记忆方法总结如下:
去掉一个最高的,去掉一个最低的,剩下的是一、二、三、赋值。双目运算符中,顺序为算术、关系和逻辑,移位和逻辑位插入其中。(其实我直接也不能完全记住 所以在写代码的过程中还是加小括号吧 hh)
知道操作符的结合性以及优先级 计算机的结果未必·一定
eg:
a*b + c*d + e*f
int main()
{
int i = 10;
i = i-- - --i * ( i = -3 ) * i++ + ++i;
printf("i = %d\n", i);
return 0; }
再举个例子
int main()
{
int i = 10;
i = i-- - --i * ( i = -3 ) * i++ + ++i;
printf("i = %d\n", i);
return 0; }

版权声明
本文为[cxy_zjt]所创,转载请带上原文链接,感谢
https://blog.csdn.net/cxy_zjt/article/details/121532005
边栏推荐
- ASP. Net daily development notes ----- IIS server supports downloading APK
- modelsim仿真加速注意点
- Define a student class 1 to get the student's name: get_ Name() return type: STR 2 get student's age: get_ Age() return type: int 3 returns the highest score among the three subjects. get_ course()
- 设计一个圆类(circle),内有私有成员radius代表半径, 函数get_radius( )用于获得半径、area( )用于计算圆的面积; (2)定义一个桌子类table,内有私有数据h
- [number theory] congruence (III): univariate linear congruence equation
- Raspberry Pi 4b
- (五) 使用Navicat创建数据库数据表并设置id自增
- Review of the sixth edition of introduction to software engineering (notes)
- 安裝和修改uTools及vscode插件安裝路徑
- a5 transceiver 信号vod和预加重调整关系
猜你喜欢

Jeecg project deployment notes

Define the class shape as the parent class, and define the method to calculate the perimeter and area in the class; (2) Define the shape subclass circle, with radius attribute and constant PI, and ove

安装和修改uTools及vscode插件安装路径

模二除运算的上商原则

桥接模式下主机ping不通虚拟机
![[bug notes] input: - WebKit autofill: the input box automatically fills in the background problem](/img/da/b737e837d5ff781f68608a6cd2c5da.png)
[bug notes] input: - WebKit autofill: the input box automatically fills in the background problem

JS realizes clicking avatar to upload picture modification

Vscode, this is enough

Process of stepping on the pit in the flutter environment

搭建ES6开发环境,实时编译
随机推荐
. net learning notes - about Net core (1) [. NETCORE's project structure, five ways to transfer values to pages, and the use of log4net and NLog]
Installer et modifier les chemins d'installation des plug - ins utools et vscode
win10修改命令行默认字体
Solution to the problem of Chinese garbled code in pyftpdlib
[number theory] Euler function (basic properties, recursive method, formula method, linear sieve method)
[number theory] prime number (4): decomposition of numbers (Pollard rho)
Pyhon3 批量合并哔哩哔哩缓存的m4s视频文件
[number theory] congruence (III): univariate linear congruence equation
sql server快速入门
软件工程导论第六版复习(笔记)
idea 不显示Run Dashboard视图窗口的问题
Leetcode punch in
MySQL学习笔记
安裝和修改uTools及vscode插件安裝路徑
Leetcode punch in
桥接模式下主机ping不通虚拟机
14行代码完成任意选择图片爬取
ASP. Net daily development notes ----- WebService server development
C语言 | 位运算符
Random库的8个函数