【C语言】室友看了这操作符,连王者都不准备打 _编程在屏幕上显示如下图案,符号可自选,如#,%,a,1,!

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	printf("%d\n", !1);
	printf("%d\n", !0);
	printf("%d\n", !5);
	return 0;
}

运行结果🖊

0

1

0

在C语言当中只要不是0那么就为真,只有0和1两种结果。


🖊 正值(“+”)和负值(“-”)

作用:顾名思义,"+“为正数,”-"号为负数

int a = 10;
a = -a;    // a = -10
a = +a;    // a = 10


🖊 (“&”)取地址运算符

描述:地址就是内存区中对每个字节的编号。地址就是用来通过内存区的编号找到变量,然后再把自己内存区的编号赋值给指针

以十六进制进行打印出来,%p ---- 表示十六进制的数据输出。

注意:取地址不光光只是取出地址,这一个小小的符号(“&”)实际上有③种作用

  1. 一种是按位与:1 & 5
  2. 一种就是这里说的取地址。
  3. 另一种声明引用,相当于定义变量别名。

🖊 (“*”)解引用运算符

描述:解引用一个指针将返回该指针所指的对象,为解引用的结果赋值。也就是为指针所指的对象赋值

指针变量就是用来进行存放地址的

int a = 20;   //(1)
int *pa = &a; //(2)
*pa = 30;     //(3)
  1. a在内存中要分配空间4个字节!
  2. 取出a的地址赋值给指针变量pa, pa说明执行对象是int类型!
  3. 进行解引用操作符 *pa 就是通过解引用(*pa)里边的地址来找到地址a的!

♦ (sizeof)操作数的类型长度

描述:实际上是获取了数据在内存中所占用的存储空间,以字节为单位来计数

int a = 1;
printf("%d\n",sizeof(a));  //①
printf("%d\n",sizeof(int));//②
printf("%d\n",sizeof a);   //③

以上三种写法均是可以的。

注意:第种写法是可以的,由此证明了 sizeof 是一个操作符,并不是函数。

当然 sizeof 也是可以计算数组的大小的。例如:

char arr[10] = {0}; 

数组是 10 个元素,每个数组元素是char类型的,char类型是一个字节,那这里就是10个字节。单位是字节,当然里面也可以是数组的类型。

拓展:sizeof 括号中放的表达式是不参与运算当中的!


🖊 (“~”) 按位取反
  • 描述:对一个数的二进制 0 变成 1 以及 1 变成 0。注意:是对 补码 进行按位取反。
  • 所谓的按位取反是包括符号位在内 在内存级别直接进行比特位翻转。
int a = -1;
//原码:100000000000000000000000000000001
//反码:111111111111111111111111111111110
//补码:111111111111111111111111111111111

int b = ~a;//b = 0

//进行取反(a) 赋值 b
//取反:000000000000000000000000000000000   

🎓自增自减运算符

  • 在 C 语言中还有两个特殊的运算符**“++“和”–”**。自增运算符和自减运算符对变量的操作分别是增加1 和 减少1。自增运算符和自减运算符可以防在变量的前面或者是后面,防止变量前面称之为前缀,放在后面称之为后缀。使用方法如下:
--operator;//自减前缀运算符
operator--;//自减后缀运算符
++operator;//自增前缀运算符
operator--;//自增后缀运算符

在上面的这些例子中,运算符的前面后面的位置并不重要,因为所得到的结果是一样的。自减就是**-1**,自增就是**+1**。

注意:在表达式内部,作为运算符的一部分,两者的用法可能有所不同。如果运算符放在变量的前面,那么变量在参加表达式运算之前完成自增或者自减运算;如果运算符放在变量后面,那么变量的自增或者自减运算符在变量参加了表达式运算之后完成。

  1. 自增/自减 后缀运算符是:后置 ++/–,先使用,再++/–。
  2. 自增/自减 前缀运算符是:前置 ++/–,先++/–,再使用。
#include <stdio.h>
int main(void)
{
	int a = 1;
	int b = a++;//自增后缀运算符
	int d = 1;
	int c = ++d;//自增前缀运算符
	printf("自增后缀运算符:%d\n",b);
	printf("自增前缀运算符:%d\n", c);
    return 0;
}


♦ (类型)强制类型转换

  • 描述:把变量从一种类型转换为另一种数据类型。
int a = 3.14;

此时,编译器就会报warning,当我强制转换的话!

int a = (int)3.14;

编译器就不会产生warning,说明我们的程序并没有问题。


🎓关系操作符

关系运算符是用于了两个数值进行比较,返回一个真值或者假值。返回针织还是假值,取决于表达式当中所用的运算符。其中真值为二进制(1),假值为二进制(0),针织表示指定的关系成立,假值则表达式指定的关系不成立。

>(大于)        >=(大于等于)    <(小于)
<=(小于等于)   !=(不等于)     ==(等于)

这里的关系操作符都是比较容易理解的,但是也要注意几个点:

  • 在编程的过程当中,"=="是等于,而“=”是赋值。
  • "=="比较两个字符串相等是不能使用等号的,用字符串函数 strcmp

🎓逻辑操作符

  • 注:非0即为真,0即为假。
🖊 (“&&”) 称为逻辑与运算符

如果两个操作数都非零,则条件为真。表示[并且]的意思。如下代码所示:

当为真的时候,打印结果为:表达式结果为真

#include <stdio.h>
int main(void)
{
	int a = 1;
	int b = 1;
	if (a && b)
		printf("表达式结果为真\n");
	else
		printf("表达式结果为假\n");
	return 0;
}

当为假的时候:打印结果为:表达式结果为假

#include <stdio.h>
int main(void)
{
	int a = 0;
	int b = 1;
	if (a && b)
		printf("表达式结果为真\n");
	else
		printf("表达式结果为假\n");
	return 0;
}

a、b 变量都为 0 的时候,那么也是:表达式结果为假

注→对于 && 来说,左边已经为 false(假) 就不再执行右边的操作了。


🖊 (“||”) 称为逻辑或运算符

如果两个操作数中有任意一个非零,则条件为真。表示[或者]的意思。如下代码所示:

当为真的时候,打印结果为:表达式结果为真

#include <stdio.h>
int main(void)
{
	int a = 1;
	int b = 0;
	if (a || b)
		printf("表达式结果为真\n");
	else
		printf("表达式结果为假\n");
	return 0;
}

当为假的时候:打印结果为:表达式结果为假

#include <stdio.h>
int main(void)
{
	int a = 0;
	int b = 0;
	if (a || b)
		printf("表达式结果为真\n");
	else
		printf("表达式结果为假\n");
	return 0;
}

a、b 变量都为 1 的时候,那么就是: 表达式结果为真

注→对于 || 来说,左边是 true 真的话就不会在执行右边的操作了。


🖊 (“!”) 称为逻辑非运算符

用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。举例说明:

#include <stdio.h>
int main(void)
{
	int a = 0;
	int b = 0;
	if (!(a || b))
		printf("表达式结果为真\n");
	else
		printf("表达式结果为假\n");
	return 0;
}

例如:上面的代码,原本应该打印的是:表达式结果为假,但是,最后却打印出来的是:表达式结果为真。这就是逻辑非运算符的作用,可以把原本为假的值变成真,反之真的值变成假。注意:操作符的优先级,逻辑非(!)的优先级在上面是最高的。


🎓条件操作符

exp1 ? exp2 : exp3 分别为 表达式1 ? 表达式2 :表达式3
  • 条件操作符也被称之为三目操作符,唯①一个具有三个数的操作符。如下例子:
if(a>b)
{
    max = a;
}
else
{
    max = b;
}

不过,C语言提供了一种更加简单的方法,叫做条件运算符,语法格式为:

表达式1 ? 表达式2 : 表达式3

条件运算符是C语言中唯一的一个三目运算符,其求值规则为:如果表达式1的值为真,则以表达式2 的值作为整个条件表达式的值,否则以表达式3的值作为整个条件表达式的值。条件表达式通常用于赋值语句之中。

上面的 if else等价于:

max = (a>b) ? a : b;

该语句的语义是:如a>b为真,则把a赋予max,否则把b赋予max


♦逗号表达式

格式:exp1,exp2,exp3,...expn
  • 逗号表达式,就是用逗号隔开的多个表达式。逗号表达式,从左向右依次执行,整个表达式的结果是最后的表达式的结果。这是一个很特殊的表达式,如下所示:
#include <stdio.h>
int main(void)
{
	int a, b=0, c=0;
	int d = (c = 1,a = 1, b -= 2, c += 2);
	printf("%d\n", d);

    return 0;
}

从上面的例子运行出的结果为:**3,**结果有可能会受到前面代码的影响!

下面来做一道练习题,主要考察的是自增自减以及逗号表达式

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

在上面代码当中需要注意:逗号表达式的规则,以及自增运算符的前置与后置区别。


🎓下标引用操作符

下标引用操作符就是访问数组下标的那个操作符,下标从都是从0开始的,依次类推下来

举例说明:

假设,拿出数组名第5个元素。
int arr[10] = {1,2,3,4,5,6,7,8,9,10};

printf("arr = %d\n",arr[4]);

如上所示:这样访问数组名当中下标当中4,就可以找到数组名第个元素。这里面的方括号**[ ]**就是下标引用操作符,通过下标来找到数组名的元素,是访问具体某一个元素。


🎓函数调用操作符

()函数调用操作符,接收一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。函数的参数分为两种,第一种:实际参数,第二种:形式参数。

真实传递给函数的参数,叫做实际参数。实参的参数可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须要有确定的值,以便把这些值传递给到形参当中去。

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元)调用一瞬间才会开辟内存空间,所以叫做形式参数。形式参数当函数调用完成之后就会自动销毁了。因此形式参数只是在函数当中有效!声明周期范围有限。

举例说明:例如用 Add()函数 实现整形 a,b 的加减👇

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int Add(int a, int b)
{
	return a + b;
}
int main(void)
{
	int a = 0;
	int b = 0;
	printf("请输入两个数字:");
	scanf("%d %d", &a, &b);
	int ret = Add(a, b);
	printf("sum = %d\n", ret);

	return 0;
}
  • 上述代码可能运行结果:输入 5 5,结果:10

🎓结构成员访问操作符

  • ***.****结构体 **.*成员名,访问的内容
  • -> 结构体指针 -> 成员名,指向对象的内容

结构体和其他类型基础数据类型一样,例如 int 类型,char 类型 只不过结构体可以做成你想要的数据类型。以方便日后的使用。在实际项目中,结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。

结构体的基础知识:这些值称之为成员变量,结构的每个成员都可以是不同类型的变量。

这篇文章是博主写的结构体文章,里面是讲述结构体知识的全面讲解🧊


🪁 隐式类型转换

C语言的整形算数运算符总是至少以缺省整形类型的精度来进行的。注意:int(整形)

为了获得这个精度,表达式中的字符短整型操作符在使用之前,都必须转换为整形提升。

🎗 负数的整形
char a = -1;

变量 a 的二进制补码只有⑧个比特位,因为1字节 = 8比特位。补码 1111 1111

在上面说过表达式中的字符型(char)在使用之前都是需要进行整形提升的时候,高位补上符号位,即为1。所以提升后的结果是:补码 1111 1111 1111 1111 1111 1111 1111 1111


🎗 正数的整形
char b = 1;

变量 b 的二进制补码只有⑧个比特位,因为 1字节 = 8比特位。补码 0000 0001

因为 char 为有符号的 char,所以整形提升的时候,高位补充符号位,即为0。所以整形提升之后的结果是:注意,原、反、补(正数一样) 0000 0000 0000 0000 0000 0000 0000 0001


🎗 整形提升
#include<stdio.h>
int main(void)
{
	int c = 0xFF;
	char b = 0xF4;
	short a = 0xFE;

	if (a == 0xF1)
		printf("Yes\n");
	if (b == 0xF4)
		printf("Yes1\n");
	if (c == 0xFF)
		printf("Yes2\n");
	return 0;
}

编译器运行结果:Yes2

所以从上面的例子就可以得出 变量 b 和 变量 a,由于是 charshort 类型,所以发生了整形提升,使得值也得到了提升,才没有执行 if判断里面的内容。


📭操作数的优先级大小

  1. 运算符的优先级确定表达式中项的组合。这会影响到一个表达式如何计算。某些运算符比其他运算符有更高的优先级,例如,乘除运算符具有比加减运算符更高的优先级。
  2. 例如 x = 7 + 3 * 2,在这里,x 被赋值为 13,而不是 20,因为运算符 * 具有比 + 更高的优先级,所以首先计算乘法 3*2,然后再加上 7
  3. 下表将按运算符优先级从高到低列出各个运算符,具有较高优先级的运算符出现在表格的上面,具有较低优先级的运算符出现在表格的下面。在表达式中,较高优先级的运算符会优先被计算。

说明: 在表达式中常常会出现这样的情况,例如:要进行 a+b,再将结果与 c 进行相乘,一不小心将表达式写成是 a+b*c。因为 *(乘号) 的优先级高于 + 号,这样的话就会先去执行 乘法运算符 的计算,显然这不是我们期望的到的结果。这个时候那么应该是怎么办呢?可以使用括号"()"将 + 运算级别提高,使其先进行运算,就可以得到自己所预期的结果了。

  • 注意:小括号"()"在运算符当中的优先级是最高的!
类别运算符结合性
后缀()   []   ->   .   ++   - -从左到右
一元+   -   !   ~   ++   - -   (type)  *   &   sizeof从右到左
乘除*   /   %从左到右
加减+   -从左到右
移位<<   >>从左到右
关系<   <=   >   > =从左到右
相等==   !=从左到右
位与 AND&从左到右
位异或 XOR^从左到右
位或 OR****
逻辑与 AND&&从左到右
逻辑或 OR**
条件?:从右到左
赋值**=   +=   -=   *=   /=   %=  >>=   <<=   &=   ^==**
逗号,从左到右

下面出一道关于操作符优先级的题目

#include<stdio.h>
int main(void)
{
	int i = 10;
	int j = 20;
	int k = 3;
	k *= i + j;
	printf("k = %d\n", k);
	return 0;
}

看到这道题有些小伙伴可能都会认为 k = 50,其实一开始我也是这样,结果,运行的时候才发现越来 k = 90。当时的我还不明白这个是为什么,结果一看,原来是优先级的问题

注意:在这里 **+**的优先级比 ***=**的优先级高!当然上面的代码其实本身并不好,因为没有可读性。我们可以把代码改下:**k *= (i+k);**这样的代码可读性就提高了


码字不易,如果对你有帮助的话,还请支持下鸭💖

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

下面出一道关于操作符优先级的题目

#include<stdio.h>
int main(void)
{
	int i = 10;
	int j = 20;
	int k = 3;
	k *= i + j;
	printf("k = %d\n", k);
	return 0;
}

看到这道题有些小伙伴可能都会认为 k = 50,其实一开始我也是这样,结果,运行的时候才发现越来 k = 90。当时的我还不明白这个是为什么,结果一看,原来是优先级的问题

注意:在这里 **+**的优先级比 ***=**的优先级高!当然上面的代码其实本身并不好,因为没有可读性。我们可以把代码改下:**k *= (i+k);**这样的代码可读性就提高了


码字不易,如果对你有帮助的话,还请支持下鸭💖

[外链图片转存中…(img-wCyTrvFe-1715851305019)]
[外链图片转存中…(img-DpxWDuER-1715851305019)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值