当前位置: 首页 > article >正文

C-操作符

操作符种类

在C语言中,操作符有以下几种:

算术操作符

移位操作符

位操作符

逻辑操作符

条件操作符

逗号表达式

下标引用,函数调用

拓展:整型提升

我们介绍常用的几个

算术操作符

+(加),-(减),*(乘),/(除),%(取余操作符)

我们直接看列子

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

 这里我们需要特别注意的是/(除号)跟%(取余操作符)

“%”取的是余数

“/”取的是整除的结果

移位操作符(不可以进行负数移动并且只能是整数)

针对的是转化后的二进制:

“<<”左移操作符,左边舍去一位,右边补0

“>>”右移操作符,左边用0补充,右边舍弃一位

来看左移操作符列子:

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

 先将10转化为二进制,然后左移一位,右边补0,得到20

右操作符与左操作符原理一样 

位操作符

“&”按位与,计算规则:有0为0,两个都是1才是1

“|”按位或,计算规则:有1为1,两个同时为0才是0

“^”按位异或,计算规则:相同为0,相异为1

#include <stdio.h>
int main()
{
	int num1 = 1;
	int num2 = 2;
	printf("%d\n",num1 & num2);//第一个
	printf("%d\n",num1 | num2);//第二个
	printf("%d\n",num1 ^ num2);//第三个
	return 0;
}

面试题目:

不创建第三个变量,来交换两个变量的值

#include <stdio.h>
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;
}

 

上面图的下面红色字是计算思路

赋值操作符 

“=”一个等号就是赋值

这里延伸复合赋值操作符,就是有两个操作符组成,右边是等号,左边是一个操作符

“<=”,a <= b

“+=”,a+=b,就是a=a+b

……

单目操作符

“!”逻辑反操作

“-”负值

“+”正值

“&”取地址

“sizeof”求操作数长度,以字节为单位

“*”通常用在指针中

“++”加加,a++(先使用,再加一),++a(先加一,再使用)

“--”减减,同加加同理

展示

#include <stdio.h>
int main()
{
	int a = -10;
	int* p = NULL;
	printf("%d\n", !2);
	printf("%d\n", !0);
	a = -a;
	p = &a;
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(int));
	printf("%d\n", sizeof a);
	return 0;
}
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;
}

如果将数组传过去进行sizeof求大小,那么求的只是那个指针的大小,不区分char,int类型

在“X86”环境中求的是4,在“X64”环境中求的是8

关系操作符

“>” 大于

“<”小于

“>=”大于等于

“<=”小于等于

“!=”不等于

“==”判断相等

逻辑操作符

“&&” 并且,必须要所有条件满足计算才会停下来,否则返回0

“||”或者,仅需满足一个条件,计算就会停下来

列题:

#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;
}

a=1,b=2,c=3,d=4

因为a=0,代入表达式,0为假,计算停止,后面的表达式也就不再继续

条件操作符

(ese ? es1 : es2),首先计算ese表达式,如果为真,答案就是es1,如果为假,答案就是es2

逗号表达式

(es1,es2,es3,es4,es5) 从左到右,依次进行,整个表达式,是最后一个表达式的结果,碰到假的表达式就跳过

下标引用,函数调用

下标引用(数组下标从0开始),如果有10个元素,最后一个元素的下标是9

int arr[10];//创建数组
 arr[9] = 10;//实用下标引用操作符。

函数调用(就是调用一个函数)
 

#include <stdio.h>
 void test1()
 {
 printf("hehe\n");
 }
 void test2(const char *str)
 {
 printf("%s\n", str);
 }
 int main()
 {
 test1();            //实用()作为函数调用操作符。
 test2("hello bit.");//实用()作为函数调用操作符。
 return 0;
}
整型提升
#include<stdio.h>
int main()
{
	char a = 3;
	char b = 127;
	char c = a + b;
	printf("%d\n",c );
	return 0;
}

 

 我们来看解析:

 


http://www.kler.cn/a/418899.html

相关文章:

  • Rust vs Java:后端开发应该选哪个?
  • 乌班图单机(不访问外网)部署docker和服务的方法
  • node.js基础学习-querystring模块-查询字符串处理(三)
  • 【实验13】使用预训练ResNet18进行CIFAR10分类
  • Python语法基础(四)
  • Android 14之HIDL转AIDL通信
  • Linux虚拟机安装nginx踩坑记录
  • 《UDS协议从入门到精通(UDS速查手册)》(完结撒花版)
  • Java之链表1
  • vue3+elPlus 选择框select 下拉数据过千条,页面卡顿,分页解决
  • Java中 HttpURLConnection 和 HttpClient 详解(初学者友好)
  • 【从零开始的LeetCode-算法】3208. 交替组 II
  • 【Git教程 之 版本控制】
  • 深入探讨SQL优化原理 - 增量查询和索引加速
  • JavaScript 高级教程:异步编程、面向对象与性能优化
  • EC2还原快照
  • 探索3D世界:使用 lib3ds 读取和解析 3DS 文件
  • CentOS使用chrony服务进行时间同步源设置脚本
  • CSS3网站
  • 欧拉函数——acwing
  • 挑战用React封装100个组件【005】
  • 【linux】(23)对象存储服务-MinIo
  • Linux 僵尸进程和孤儿进程, 进程优先级
  • Android 12.0新增自定义HIDL问题记录
  • 内网穿透步骤
  • Spring Data JPA(二) 高级进阶