C语言各类操作符全面讲解

目录
  • 1 算术操作符
  • 2 移位操作符
  • 3 位操作符
  • 4 赋值操作符
  • 5 单目操作符
    • 5.1 ! 逻辑反操作
    • 5.2 sizeof 和数组
  • 6 关系操作符
  • 7 逻辑操作符
  • 8 条件操作符
  • 9 逗号表达式
  • 10 下标引用函数调用和结构成员
    • 10.1 [ ]下标引用操作符
    • 10.2 ()函数调用操作符
    • 10.3 访问一个结构的成员
  • 11 表达式求值
    • 11.1 整形提升
    • 11.2 优先级和结合性
  • 总结

1 算术操作符

+ - * / %

+,-和*操作数我就不多说了,这里我们重点来 / 和%

/操作数

作用:就是求商

注意点:

1 二边的操作数都是整形,商的结果就为整数

2 二边的操作数有一个是浮点型结果就为小数

%操作数

作用:求余数

注意点:. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

2 移位操作符

<< 左移操作符

>> 右移操作符

注意:移位操作符移的是二进制位,且操作数只能是整数

<< 左移操作符

规则:左边抛弃、右边补0

代码举例:

#include<stdio.h>
int main()
{
	int a = -5;
//正数的原码,反码和补码都相同
//这是负数的规则:
//10000000000000000000000000000101原码
//11111111111111111111111111111010反码(原码的符号位不变,其他位按位取反)
//11111111111111111111111111111011补码(反码+1就是补码)
	int b = a << 1;
//11111111111111111111111111110110补码
//11111111111111111111111111110101反码
//10000000000000000000000000001010原码
	printf("a = %d\n", a);
	printf("b = %d\n", b);
	return 0;
}

当a<<1时

当a<<2时

当a<<3时

总结:

1 操作数被移位操作符操作后其值仍然不变

2 计算机存储的都是补码,而打印出来的是原码所对应的值

3 b=a<<n时,b的值位a*2^n,也就是说当我们左移1位时相当与乘了个2倍

>> 右移操作符

移位规则: 首先右移运算分两种:

1. 逻辑移位 左边用0填充,右边丢弃

2. 算术移位 左边用原该值的符号位填充,右边丢弃

代码举例:

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

当a>>1时

当a>>2时

当a>>3时

总结:

1 右移操作和左移操作是本质都是对补码的二进制位进行操作

2 b=a>>n时,b的值位a/2^n,也就是说当我们左移1位时相当与除了个2倍

注意:

对于移位运算符,不要移动负数位,这个是标准未定义的。

3 位操作符

& //按位与

| //按位或

^ //按位异或

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

我们这些位操作符都是针对操作数的补码进行操作的

&操作符

作用:对于二进制数,都为0才为0都为1才为1

代码举例:

#include<stdio.h>
int main()
{
	int a = 5;
//00000000000000000000000000000101  5的补码
	int b = -3;
//10000000000000000000000000000011  3的原码
//11111111111111111111111111111100  3的反码
//11111111111111111111111111111101  3的补码
	int c = a & b;
//00000000000000000000000000000101  5的补码
//11111111111111111111111111111101  3的补码
// &的作用是二进制数,都为0才为0都为1才为1
//00000000000000000000000000000101  c的补码
	printf("a = %d\n", a);
	printf("b = %d\n", b);
	printf("c = %d\n", c);
	return 0;
}

|按位或

作用:二进制位中有一个为1就为1,

^按位异或

作用:二进制位中相异置1,相同为置0

大家知道这些操作符的作用了,我们来做到题目来实战一下吧。

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

代码实现:

#include<stdio.h>
int main()
{
	int a = 2;
	//0010
	int b = 3;
	//0011
	printf("交换前a = %d,b = %d \n", a, b);
	a = a ^ b;
	//a的值0001
	b = a ^ b;
	//b的值0010(2)
	a = a ^ b;
	//a的值0011(3)
	printf("交换后a = %d,b = %d\n", a, b);
	return 0;
}

题目2:编写代码实现:求一个整数存储在内存中的二进制中1的个数。

代码实现:

//num&1便会找到二进制最低位是否为1
#include<stdio.h>
int main()
{
	int num = -1;
	int i = 0;
	int count = 0;//计数
	for (i = 0;i < 32;i++)
	{
		if (num & (1 << i))
		{
			count++;
		}
	}
	printf("二进制数中1的个数:count = %d\n", count);
	return 0;
}

总结:

我们要想看二进制中的最低位是1还0,我们就可以通过&1来实现。

4 赋值操作符

=

这个操作符是用来赋值的,我们要于‘==’区分,这个是用来表示相等的,大家是否在编程的时候会弄错呢?下面教大家一种写法可以在很大程度上避免这种错误。

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int a = 1;
	if (1 == a)
	{
		printf("可以避免错误\n");
	}
}

要是我们写成1=a,就会报下面的错误,这样我们就能够及时的改正自己的错误,是不是很好呢。

复合赋值符

+=

-=

*=

/=

%=

>>=

<<=

&=

|=

^=

这些都是=操作符的复合形式,举个例子。

a+=10;就相当于a=a+10;

a-=10;就相当于a=a-10;

5 单目操作符

! 逻辑反操作

- 负值

+ 正值

& 取地址

sizeof 操作数的类型长度(以字节为单位)

~ 对一个数的二进制按位取反

-- 前置、后置--

++ 前置、后置++

* 间接访问操作符(解引用操作符)

(类型) 强制类型转换

单目操作符的操作对像是1个,下面我们来一一细说。

5.1 ! 逻辑反操作

就是让真变假,假变真

代码举例:

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

5.2 sizeof 和数组

sizeof是用来求操作数的类型长度(以字节为单位)

下面我们来看到这段代码

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

他们的结果分别是 40 10 4 4,为什么呢?

第一个我们求的是整的数组的大小,arr有10个元素,每个元素都是整形,所有数组的大小为40个字节。

第二个ch有10个元素,每给个元素为char 类型,所以ch数组大小为10字节

第三个和第四个传的是数组名(本质上都是首元素地址),那么对于test1和test2应该用指针来接收,所以在test1和test2其实求的是指针的大小,在32平台,指针的大小应该为4个字节。

6 关系操作符

>

>=

< <=

!= 用于测试“不相等”

== 用于测试“相等”

7 逻辑操作符

&& 逻辑与

|| 逻辑或

用一道例题来说明逻辑操作符

#include <stdio.h>
int main()
{
    int i = 0, a = 0, b = 2, c = 3, d = 4;
    i = a++ && ++b && d++;
    //i = a++||++b||d++;
    printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
    return 0;
}

为什么b= 2,c= 3,d =4呢?我们不是进行来对bcd进行了前置++或者后置++的操作吗?

这是因为对于&&来说只要他的左表达式为假了,后面就不在执行。

而对于||来说只要左表达式为真,后面就不在执行了

8 条件操作符

xp1 ? exp2 : exp3

这个意思就是如果xp1为真,就执行exp2,否则就执行exp3。

9 逗号表达式

exp1, exp2, exp3,.......expN

逗号表达式,就是用逗号隔开的多个表达式。

逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。

10 下标引用函数调用和结构成员

10.1 [ ]下标引用操作符

操作数:一个数组名 + 一个索引值

对于一个已经初始化的数组来说,arr[7]和7[arr]及*(arr+7)都是等价的。

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	arr[7] = 5;
	printf("arr[7] = %d\n", arr[7]);
	7[arr] = 6;
	printf("arr[7] = %d\n", arr[7]);
	*(arr + 7) = 7;
	printf("arr[7] = %d\n", arr[7]);
	return 0;
}

10.2 ()函数调用操作符

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

10.3 访问一个结构的成员

. 结构体.成员名

-> 结构体指针->成员名

11 表达式求值

对于一给表达式我们一般要考虑它的计算操作符的优先级和结合性,当表达式进行求值的时候还可能会发生整形提升。

11.1 整形提升

什么是整形提升呢?就是在计算的计算的过程中都是默认以整形的方式进行计算的,当我是char类型参与计算时候就要发生整形提升。

整形提升规则:

负数的整形提升

char c1 = -1;

变量c1的二进制位(补码)中只有8个比特位:

1111111

因为 char 为有符号的 char

所以整形提升的时候,高位补充符号位,即为1

提升之后的结果是: 11111111111111111111111111111111

正数的整形提升

char c2 = 1;

变量c2的二进制位(补码)中只有8个比特位:

00000001

因为 char 为有符号的 char 所以整形提升的时候,高位补充符号位,即为0

提升之后的结果是: 00000000000000000000000000000001

无符号整形提升,高位补0

11.2 优先级和结合性

对于应该复杂表达式的求值有三个影响的因素。

1. 操作符的优先级

2. 操作符的结合性

3. 是否控制求值顺序。

两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。

那么我们知道了解复杂表达式的3个元素,那么表达式求数的结果一定说唯一的吗?

下面我们来看到问题表达式:

int c = 1;

int b = c+ --c;

请问b中的值是什么?

b=1?b=0?为什么二个结果呢?

对--操作符的优先级是比+高的,但是并没有规定系统是怎么给C准备空间的,如果开始为就表达中的c开辟了空间,那么结果就为1,如果是在--c之后在开辟空间的,那么结果就为0。

这些问题表达式我们要谨防在我们的代码中出现。

总结

对于这些操作符,不是看完这篇博客将能掌握的,大家还是要在写代码多练习。

到此这篇关于C语言各类操作符全面讲解的文章就介绍到这了,更多相关C语言操作符内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言实例上手深入理解操作符的使用

    目录 1.闰年练习 2.绝对值练习 3.字符转换练习 4.四则表达式练习 5.隐式类型转换 1.闰年练习 编写逻辑表达式判断用户给定的年份是否是闰年,年份可以被4整除但不能被100整除:年份可以被400整除. #include <stdio.h> int main(){ int year = 0 ,res = 0; printf("请输入年份数字:"); scanf("%d",&year); res = (!(year % 400)) || (!

  • C语言 操作符#与##使用方法详解

    目录 一.# 运算符 二.## 运算符 三.小结 一.# 运算符 # 运算符用于在预处理期将宏参数转换为字符串 # 的转换作用是在预处理期完成的,因此只在宏定义中有效 编译器不知道 # 的转换作用 用法: #define STRING(x) #x printf("%s\n",STRING(Hello World!)); 下面通过一个示例感受一下: test.c: #include <stdio.h> #define STRING(x) #x int main() { pri

  • C语言操作符超详细讲解上篇

    目录 前言 1.操作符的分类 2.算术操作符 3.移位操作符 3.1 左移操作符 3.1.1 正数左移1位 3.1.2 负数左移1位 3.2 右移操作符 3.2.1 正数右移1位 3.2.2 负数右移1位 3.3 移位操作符说明 4.位操作符 4.1 练习 1 4.2 练习 2 总结 前言 操作符主要内容包括:各种操作符的介绍,用表达式求值. 1.操作符的分类 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用.函数调用和结构成员

  • C语言全面细致精讲操作符的使用

    目录 前言 一.算术操作符 二.移位操作符 1.左移操作符 2.右移操作符 三.位操作符 四. 赋值操作符 复合赋值符 五.单目操作符 单目操作符介绍 1.sizeof 和 数组 2.++和–运算符 六.关系操作符 七.逻辑操作符 八.条件操作符 九.逗号表达式 十.下标引用与函数调用和结构成员 1. []下标引用操作符 2. ()函数调用操作符 3. 访问一个结构的成员 前言 本次文章我们要讲各种操作符的介绍,内容非常详细,大家拭目以待哦! 首先介绍操作符的种类 操作符分类: 算术操作符 移位

  • C语言超全面覆盖操作符知识点

    目录 算术操作符 赋值操作符 算术操作符 主要是 (+ - * / %) 五种算数操作符. 1.除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数. 2.对于 / 操作符如果两个操作数都为整数,执行整数除法.而只要有浮点数执行的就是浮点数除 法. 3.% 操作符的两个操作数必须为整数.返回的是整除之后的余数. 当除数为小数时,int类型只会截取整数部分. 移位操作符 << 左移操作符 >> 右移操作符 左移操作符 移位规则: 左边抛弃.右边补0 右移操作符 移位规则: 首

  • C语言简明讲解操作符++和--的使用方法

    目录 一.++与--操作符的本质 二.++与-- 操作符使用分析 三.小结 一.++与--操作符的本质 ++ 和 -- 操作符对应两条汇编指令 前置 变量自增(减)1 取变量值 后置 取变量值 变量自增(减)1 下面看一段神奇的代码: #include <stdio.h> int main() { int i = 0; int r = 0; r = (i++) + (i++) + (i++); printf("i = %d\n", i); printf("r =

  • C语言操作符进阶教程(表达式求值隐式类型转换方法)

    目录 结构体 表达式求值 隐式类型转换 意义: 方法 算术转换 操作符属性 结构体 结构体变量的声明需要在主函数之上或者主函数中声明,如果在主函数之下则会报错,而且c语言中的结构体不能直接进行强制转换,只有结构体指针才能进行强制转换. 涉及结构体的操作符这里讲两个:. (结构体访问操作符)-> () 首先写一段代码: int main() { struct Stu s = {"me",19,60}; prinft("%s %d %lf",s.who,s.age

  • C语言操作符超详细讲解下篇

    目录 前言 赋值操作符 单目操作符 单目操作符介绍 sizeof 和 数组 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用与函数调用和结构成员 [ ] 下标引用操作符 ( ) 函数调用操作符 访问一个结构的成员 表达式求值 隐式类型转换-整形提升 算术转换 操作符的属性 总结 前言 本文接着学习操作符的内容. 赋值操作符 赋值操作符就是能够重新赋值 int weight = 120;//体重 weight = 89;//不满意就赋值 double salary = 10000.0; s

  • C语言选择、循环、函数、数组与操作符

    目录 1.选择语句 2.循环语句 3.函数 4.数组 5.操作符 5.单目操作符 6.关系操作 7.逻辑操作符 8.条件操作符 9.逗号表达式 10.下标引用.函数调用和结构成员 1.选择语句 如果你好好学习,校招时拿一个好offer,走上人生巅峰.如果你不学习,毕业等于失业,回家卖红薯.这就是选择! #include<stdio.h> int main() {     int a = 0;     printf("1:好好学习,拿大厂offer     2.宿舍摆烂,毕业即失业\n

  • C语言各类操作符全面讲解

    目录 1 算术操作符 2 移位操作符 3 位操作符 4 赋值操作符 5 单目操作符 5.1 ! 逻辑反操作 5.2 sizeof 和数组 6 关系操作符 7 逻辑操作符 8 条件操作符 9 逗号表达式 10 下标引用函数调用和结构成员 10.1 [ ]下标引用操作符 10.2 ()函数调用操作符 10.3 访问一个结构的成员 11 表达式求值 11.1 整形提升 11.2 优先级和结合性 总结 1 算术操作符 + - * / % +,-和*操作数我就不多说了,这里我们重点来 / 和% /操作数

  • R语言变量赋值深入讲解

    变量可以使用向左,向右且等于操作符来分配值.可以使用 print() 或 cat() 函数打印变量的值.cat() 函数将多个项目并成连续并打印输出. # Assignment using equal operator. var.1 = c(0,1,2,3) # Assignment using leftward operator. var.2 <- c("learn","R") # Assignment using rightward operator. c

  • C语言指针超详细讲解上篇

    目录 前言 1.指针是什么 1.1 指针变量 1.2 指针是内存中一个最小单元的编号 2.指针和指针类型 2.1 指针±类型 2.2 指针的解引用 2.2.1 int* 类型的解引用 2.2.2 char* 类型的解引用 3.野指针 3.1 野指针成因 3.1.1 指针未初始化 3.1.2 指针越界访问 3.1.3 指针指向的空间释放 3.2 如何规避野指针 总结 前言 本文开始指针相关内容的学习,主要内容包括: 指针是什么 指针和指针类型 野指针 指针运算 指针和数组 二级指针 指针数组 1.

  • C语言指针超详细讲解下篇

    目录 前言 指针运算 指针±整数 4.1 指针±整数 4.2 指针-指针 4.3 指针的关系运算 5.指针和数组 6.二级指针 7.指针数组 7.1 举例 1 7.2 举例 2 总结 前言 本文接着上一篇内容,继续学习指针相关知识点. 指针运算 指针±整数 指针-指针 指针的关系运算 4.1 指针±整数 #define VALUE 5 int main() { float values[VALUE]; float *vp; //指针+-指针,关系运算 for (vp = &values[0];

  • C语言数组超详细讲解上

    目录 前言 1.一维数组的创建和初始化 1.1 一维数组的创建 1.2 一维数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 2.二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存储 3.数组越界 4.数组作为函数参数 4.1 冒泡排序函数的错误设计 4.2 数组名是什么? 4.3 对数组名的用法进行总结 4.4 冒泡排序函数的正确设计 总结 前言 本文主要介绍数组相关的内容,主要内容包括: 一维数组

  • python 调用c语言函数的实例讲解

    虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了 具体流程: c编写相关函数 ,编译成库 然后在python中加载这些库,指定调用函数. 这些函数可以char ,int, float, 还能返回指针. 以下示例: 通过python调用c函数,返回"hello,world 字符串" 新建c语言文件 hello.c touch hello.c #include <stdio.h> char *get_str() {

  • C语言 基本语法示例讲解

    C 基本语法 我们已经看过 C 程序的基本结构,这将有助于我们理解 C 语言的其他基本的构建块. C 的令牌(Tokens) C 程序由各种令牌组成,令牌可以是关键字.标识符.常量.字符串值,或者是一个符号.例如,下面的 C 语句包括五个令牌: printf("Hello, World! \n"); 这五个令牌分别是: printf ( "Hello, World! \n" ) ;  分号 ; 在 C 程序中,分号是语句结束符.也就是说,每个语句必须以分号结束.它表

  • R语言基本语法深入讲解

    基本数据类型 数据类型 向量 vector 矩阵 matrix 数组 array 数据框 data frame 因子 factor 列表 list 向量 单个数值(标量)没有单独的数据类型,它只不过是向量的一种特例 向量的元素必须属于某种模式(mode),可以整型(integer).数值型(numeric).字符型(character).逻辑型(logical).复数型(complex) 循环补齐(recycle):在一定情况下自动延长向量 筛选:提取向量子集 向量化:对向量的每一个元素应用函数

  • R语言基础画图实例讲解

    1.plot函数 plot(x,y,xlim=c(0,100),ylim=c(0.4,1), type="o",lwd=2,col=2,pch=24,cex=1.5, yaxs="i",xaxs="i", xlab="Sample Ration(%)",ylab="Accuracy") x,y : 要画图的x轴内容和y轴内容 xlim,ylim: x轴和y轴的范围 type: 表示图的形状,是点.线.点线.

  • R语言归一化处理实例讲解

    归一化就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内.首先归一化是为了后面数据处理的方便,其次是保正程序运行时收敛加快. R语言中的归一化函数:scale 数据归一化包括数据的中心化和数据的标准化. 1. 数据的中心化 所谓数据的中心化是指数据集中的各项数据减去数据集的均值. 例如有数据集1, 2, 3, 6, 3,其均值为3,那么中心化之后的数据集为1-3,2-3,3-3,6-3,3-3,即:-2,-1,0,3,0 2. 数据的标准化 所谓数据的标准化是指中心化之后

随机推荐