首页 > 其他分享 >C语言操作符详解

C语言操作符详解

时间:2024-05-26 12:59:36浏览次数:17  
标签:main int 补码 C语言 详解 操作符 printf include

文章目录

一、操作符分类

  • 算数操作符: +-*/%
  • 移位操作符: <<>>
  • 位操作符:&|^
  • 赋值操作符:=+=-=*=/=%=<<=>>=&=|=^=
  • 单目操作符:!++&*+-~sizeof()
  • 关系操作符: &&||
  • 条件操作符:?:
  • 逗号表达式:,
  • 下标引用:[ ]
  • 函数调用: ()
  • 结构成员访问:.->

二、二进制和进制转换

1、各种进制的区别

计算机中使用的是二进制,只有1、0组成这样更容易硬件实现,也包括八进制、十进制、16进制等。
这些进制只是不同的形式而已
生活中长用的进制为10进制
十进制:由0~9组成
八进制:由0~7组成
十六进制:由0~9和A~F组成
A=10,B=11,C=12,D=13,E=14,F=15
二进制满2进1
八进制满8进1
十进制满10进1
十六进制满16进1

15用不同进制表示:

二进制:1111
八进制:17
十进制:15
十六进制:F

2、二进制转十进制

其实10进制的123表⽰的值是⼀百⼆⼗三,为什么是这个值呢?其实10进制的每⼀位是权重的,10进制的数字从右向左是个位、⼗位、百位…,分别每⼀位的权重是100,101,102……
如下图:

在这里插入图片描述
2进制和10进制是类似的,只不过2进制的每⼀位的权重,从右向左是:20 , 21 , 22
如果是2进制的1101,该怎么理解呢?

在这里插入图片描述

3、二进制转八进制和十六进制

二进制转八进制,从右向左每三位二进制算一位八进制

在这里插入图片描述

二进制转十六进制,从右向左每四位二进制算一位十六进制

在这里插入图片描述

三、原码、反码、补码

原码、反码、补码是二进制的三种不同的形式
我们看到的是原码的值,当存储这个值时在内存里用补码存储。
有符号的整数,最高位为符号位,0表示“正”,1表示“负”。
正数的原、反、补码相同。
负数的原、反、补都不同。

在这里插入图片描述

负数的反码按原码除符号位外按位取反
负数补码是反码加一
补码转原码也可以符号位不变取反加以

对于整形来说:数据存放内存中其实存放的是补码。
为什么呢?
在计算机系统中,数值⼀律⽤补码来表⽰和存储。原因在于,使⽤补码,可以将符号位和数值域统⼀
处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算
过程是相同的,不需要额外的硬件电路。

四、移位操作符

<<左移操作符
>>右移操作符
注意:移位操作符的操作数为整数,移的是在内存中补码的二进制位。

1、左移操作符

移位规则:左边丢弃、右边补0

#include<stdio.h>
int main()
{
	int a = -1;
	a = a << 1;//向左移动1位二进制
	printf("%d\n", a);
	return 0;
}

在这里插入图片描述

这里可以看出左移有乘2的效果,移n位乘n个二。

2、右移操作符

移位规则:
1、逻辑右移:左边补0,右边丢弃
2、算数右移:左边补原符号位,右边丢弃

#include <stdio.h>
int main()
{
	int num = 10;
	int n = num >> 1;
	printf("n= %d\n", n);
	printf("num= %d\n", num);
	return 0;
}

在这里插入图片描述
这里在VS编译器运行时算数右移,有除2的效果,但会丢弃余数。

五、位操作符。

他们的操作数必须是整数。

1、按位与&

对内存中的补码进行操作,全1得1否则为0。
在这里插入图片描述

2、按位或|

对内存中的补码进行操作,见1得1否则为0.
在这里插入图片描述

3、按位异或^

不同为1,相同为0。
支持结合率

5 ^ 5 =0
5 ^ 0 = 5
5 ^ 5 ^ 3 = 3
5 ^ 3 ^ 5 = 3

4、按位取反~

~15=0000
~0000=1111

六、单目操作符

单目操作符的特点只有一个操作数。

1、!非运算符

!0=1
!1=0

2、++加加运算符

分前置++,后置++
前置++先加后使用,后置++先使用后加
效果为加一


#include <stdio.h>
int main()
{
	int a = 1;
	int b = 1;
	printf("a=%d\n", a++);
	printf("b=%d\n", ++b);
	return 0;
}

在这里插入图片描述

3、–减减运算符

分前置–,后置–
前置–先加后使用,后置–先使用后加
效果为减1

#include <stdio.h>
int main()
{
	int a = 1;
	int b = 1;
	printf("a=%d\n", a--);
	printf("b=%d\n", --b);
	return 0;
}

在这里插入图片描述

4、&取地址操作符

取得一个变量的地址,可以结合scanf()函数往里面输入值

#include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	printf("%d\n", a);
	return 0;
}

在这里插入图片描述

5、解引用操作符*

可以把一个地址对应的值解出来,经常用于指针操作

#include <stdio.h>
int main()
{
	int a = 5;
	int b = 0;
	b = *&a;
	printf("%d\n", b);
	return 0;
}
6、正号+

没有实质作用打印时会省略正号


#include <stdio.h>
int main()
{
	int a = 5;
	int b = 0;
	b = +a;
	printf("%d\n", b);
	return 0;
}

在这里插入图片描述

6、负号-

把正数变负数,负数变正数

#include <stdio.h>
int main()
{
	int a = 5;
	int b = 0;
	b = -a;
	printf("%d\n", b);
	return 0;
}

在这里插入图片描述

7、取反操作符~

在位操作符中说到过,对二进制位取反

8、sizeof

可以算出类型占用字节数

#include <stdio.h>
int main()
{
	int a = 0;
	printf("%zd\n", sizeof a);//变量名是可以省略括号由此证明sizeof是操作符,而不是函数
	printf("%zd\n", sizeof(int));//类型名不能省略括号
	return 0;
}

在这里插入图片描述
变量名是可以省略括号由此证明sizeof是操作符,而不是函数
返回类型为size_t可以用%zd或%zu打印结果

9、强制类型转换()
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	b = sizeof((char)a);
	printf("%zu\n", b);
	return 0;
}

在这里插入图片描述
本来int占4个字节,转换成char类型只占一个字节。

七、逗号表达式 ,

#include <stdio.h>
int main()
{
	int a = (3, 4, 5, 6);
	int b = 0;
	b = 3, 4, 5, 6;
	printf("a=%d\n", a);
	printf("b=%d\n", b);
	return 0;
}

在这里插入图片描述

在初始化时加括号,结果为最右边的表达式
在不初始化赋值时不用加括号写逗号表达式,结果为最左边的表达式值。

八、下标访问[],函数调用()

1、下标访问[]操作符

对数组的操作的操作符,可以指定数组元素的下标。
数组元素的下标从0开始

#include <stdio.h>
int main()
{
	int a[] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("a[0]=%d\n", a[0]);
	printf("a[9]=%d\n", a[9]);
	return 0;
}

在这里插入图片描述

2、函数调用操作符()

在调用函数时需要加上括号()

#include<stdio.h>
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int a = 10;
	int b = 5;
	int c=Add(a, b);
	printf("%d\n", c);
	return 0;
}

在这里插入图片描述

上面代码中自己创建了两数相加的函数Add使用时加(),还有库函数printf()也要加括号()

九、结构体访问操作符

1、结构体直接访问操作符.

是一个英文状态下的点号.
使⽤⽅式:结构体变量.成员名

#include<stdio.h>
#include<string.h>
struct student
{
	char name[10];
	int age;
};
int main()
{
	struct student s;
	//字符串赋值不能直接等于要用到strcpy()函数,引用string.h头文件
	strcpy(s.name, "小明");
	s.age = 15;
	printf("姓名:%s\n", s.name);
	printf("年龄:%d\n", s.age);

}

在这里插入图片描述

2、结构体的间接访问

当指针指向结构体可以用->这个箭头来访问
使⽤⽅式:结构体指针->成员名

#include<stdio.h>
#include<string.h>
struct student
{
	char name[10];
	int age;
};
int main()
{
	struct student s;
	//字符串赋值不能直接等于要用到strcpy()函数,引用string.h头文件
	strcpy(s.name, "小明");
	s.age = 15;
	struct student* p = &s;
	printf("姓名:%s\n", p->name);
	printf("年龄:%d\n", p->age);

}

在这里插入图片描述

十、操作符的属性:优先级、结合性

C语⾔的操作符有2个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序。
在这里插入图片描述
参考:https://zh.cppreference.com/w/c/language/operator_precedence

十一、表达式求值。

1、整形提升

整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节⻓度⼀
般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。
因此,即使两个char类型的相加,在CPU执⾏时实际上也要先转换为CPU内整型操作数的标准⻓
度。
通⽤CPU(general-purpose CPU)是难以直接实现两个8⽐特字节直接相加运算(虽然机器指令中
可能有这种字节相加指令)。所以,表达式中各种⻓度可能⼩于int⻓度的整型值,都必须先转换为
int或unsigned int,然后才能送⼊CPU去执⾏运算。

一般整形提升的是cahr 和 short 类型

2、算数转换

但不同类型相互计算时会把排名的的类型转换成排名高的类型进行运算
在这里插入图片描述
按照上图排名进行转换
在我发的一篇C语言易错题中就体现了这一性质

标签:main,int,补码,C语言,详解,操作符,printf,include
From: https://blog.csdn.net/2401_83305953/article/details/139182262

相关文章

  • 数据结构与算法学习(06)查找(3)Trie树(C语言)——BUAA
    文章目录查找(3)——Trie树(C语言)介绍结构实现典型应用(字典树)代码实现优势查找(3)——Trie树(C语言)介绍本文为查找第三部分,主要是整理了本人上课时讲的内容,并给出了C语言代码实现结构实现键值由固定的字符序列组成(如数字或字母),如Huffman码、英文单词;对应结点的分层标记......
  • C语言游戏实战(12):植物大战僵尸(坤版)
    植物大战僵尸前言:本游戏使用C语言和easyx图形库编写,通过这个项目我们可以深度的掌握C语言的各种语言特性和高级开发技巧,以及锻炼我们独立的项目开发能力,在开始编写代码之前,我们需要先了解一下游戏的基本规则和功能:游戏界面:游戏界面是一个矩形区域,玩家可以在区域内进行......
  • 基础6 探索JAVA图形编程桌面:集合组件详解
            我们的团队历经了数不胜数的日夜,全力以赴地进行研发与精心调试,最终成功地推出了一款具有革命性意义的“图形化编程桌面”产品。这款产品的诞生,不仅极为彻底地打破了传统代码开发那长久以来的固有模式,更是把焦点聚集于解决长期以来一直困扰着开发者的一大难题—......
  • c语言函数宏的封装方式有哪几种?
    在c语言开发中,出了使用函数封装代码之外,也经常使用宏来封装一些重要或简洁的代码。宏在c开发有三种:预定义宏,不带参宏,和带参数宏。通常,带参数宏也叫函数宏,函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销,在实......
  • C语言数据运算
    第1关:输入三个整数,求它们的和及平均值。任务描述本关任务:设计一个程序,输入三个整数,求它们的和及平均值。相关知识为了完成本关任务,你需要掌握:算术运算、域宽控制。算术运算C语言的算术运算符有以下几种:①+——加法运算符,如3+5。②-——减法运算符或负值运算符,如5-2,-3......
  • 基于Kaggle学习MONAI(三)2D-Segmentation例程代码详解1
    1简介         MONAI网站提供了2D分类/分割、3D分类/分割等例程代码如下图所示,通过学习例程代码,初学者能够尽快掌握MONAI框架,但是由于开源框架软件版本更新较快、各模块功能难以协调等原因,这些例程往往无法在Kaggle平台直接运行。本文对MONAI官网第二个例程,即2D分割......
  • 【赛题解析】【网络建设与运维】2023年全国职业院校技能大赛中职组“网络建设与运维”
    在此之前,欢迎关注波比网络波比网络官方公众号:blbinet波比网络工作室官方公众号:blbistudio技能大赛各赛项交流群:https://www.blbi.cn/threads/40/更多正式赛题源文件访问:https://www.blbi.cn获取技术支持访问:https://www.blbi.cn/form/1/selectNISP、CIPS、PTE证书可......
  • 【赛题解析】【网络建设与运维】2023年全国职业院校技能大赛中职组“网络建设与运维”
    在此之前,欢迎关注波比网络波比网络官方公众号:blbinet波比网络工作室官方公众号:blbistudio技能大赛各赛项交流群:https://www.blbi.cn/threads/40/更多正式赛题源文件访问:https://www.blbi.cn获取技术支持访问:https://www.blbi.cn/form/1/selectNISP、CIPS、PTE证书可......
  • C语言期末考试经典编程题Days-3(持续更新中...)
    作者:叮当喵编程简介:一只正在打怪升级的路上的小喵,欢迎大家一起探讨。目录1.将一个二维数组行和列元素互换,存到另一个二维数组中。2.求一个矩阵的最大值以及最大值的下标。3.统计单词个数4.比较字符串的大小5.求矩阵对角线之和6.有序数组插入元素7.将数组逆序8.杨辉......
  • C语言期末考试经典编程题Days-2(持续更新中...)
    目录1.统计各类字符数量2.水仙花数3.完数 4.找规律数列求和5. 自由落体6.猴子吃桃7.输出菱形8.九九乘法表1.统计各类字符数量题目:输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。格式:输入一行字符。输出统计每种字符的个数值。......