初识C语言(3)

11.操作符

简单介绍一下

算术操作符:

+ ,,*,/,%

  • 它们分别是加、减、乘、除、取模(取余)

/ 除法中有整数除法浮点数除法,前者比如 int a = 7/2;答案a = 3
而如果我们要执行浮点数除法,就得保证除法和被除数中至少有一个数是浮点数 ,例:7/2.0 或7.0/2 或7.0/2.0
取余操作符 % 顾名思义就是取余数,比如 int a = 7 %3;答案a = 1
但是取余只能用于整型当中,像7%2.0这种编译器是不允许的

移位操作符 :

>> <<
右移左移,

位操作符:

&^|
按位与,按位异或,按位或;
这两种操作符都是与二进制位有关,移位的是二进制位,操作的也是二进制位。

赋值操作符:

= += -= *= /= &= ^= |= >>= <<=

第一个 “=”’我们再熟悉不过了;
a+=1;就等于a = a + 1;
同理,a -=1;就等于 a = a - 1;

单目操作符:

符号所代表的含义
!逻辑反操作
负值
+正值
&取地址
sizeof操作数的类型长度(以字节为单位)
~对一个数的二进制按位取反
++前置、后置-++
_ _前置、后置- -
*间接访问操作符(解引用操作符)
(类型)强制类型转换

啥叫单目操作符?意思是只有一个操作数;像 ==+==这种需要两个数相加的我们称之为双目操作符。

关系操作符:

符号所代表的含义
>大于
>=大于等于
<小于
<=小于等于
!=用于测试“不等于”
==用于测试“相等”

逻辑操作符:

  • && 逻辑与
  • | | 逻辑或

逻辑与 的意思就是我们生活中的“并且’’ ,
两个操作数都为真才为真

逻辑或 所对应的是或者,
两个操作数只要有一个为真,则为真

条件操作符:

exp1 ? exp2 : exp3

这是一个三目操作符,C语言中唯一的一个三目操作符,有三个操作数。
意思很简单,表达式1条件真假?成立执行表达式2,不成立执行3.

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int c = 0;
	c = (a > b ? a : b);//如果a大于b,则将a赋值给c,否则将b赋值给c
	printf("%d\n", c);
	return 0;
}

逗号表达式:

exp1, exp2, exp3, …expN

意思是从左至右依次计算,结果是算到最后一个表达式的结果

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 4;
	int c = 5;
	int d = (a += 3, b += 4, c += 5, c + 6);//逗号表达式
	printf("%d\n", d);
	return 0;
}

答案输出为 16

下标引用、函数调用和结构成员操作符

[ ]().–>

12.常见关键字

请添加图片描述

这些关键字是C语言自带的,用户自己是不能创建的

12.1 关键字typedef

意思是类型重命名

//将unsigned int 重命名为uint_66, 所以uint_66也是一个类型名
typedef unsigned int uint_66;
int main()
{
    //观察num1和num2,这两个变量的类型是一样的
    unsigned int num1 = 0;
    uint_66 num2 = 0;
    return 0;
}

12.2 关键字static

在C语言中:static是用来修饰变量和函数的

  • static修饰局部变量,称为静态局部变量
  • static修饰全局变量,称为静态全局变量
  • static修饰函数,称为静态函数

在C语言学习中我们把内存分为三大块,它们分别是栈区、堆区、静态区

栈区:临时作用的变量都在栈区,如局部变量,形式参数。特点是进入作用域创建,出作用域销毁(并不是真的销毁了,而是还给了操作系统)。

堆区:动态内存分配的地方

静态区:存储全局变量、静态变量,特点是创建好后,直到程序结束才销毁(还给操作系统)

  1. static 修饰局部变量
    请看以下代码:
#include <stdio.h>
void test()
{
	int a = 5;
	a++;
	printf("%d ", a);
}

int main()
{
	int i = 0;
	while (i < 10)	{
		test();
		i++;
	}

	return 0;
}

在这段代码中,调用test()函数时,因为a是个局部变量,每次调用函数时都需创建,所以它的值始终是5
于是答案是这样的
请添加图片描述

局部变量在被static修饰过后,从栈区转到了静态区,改变了它的生命周期

#include <stdio.h>
void test()
{
	static int a = 5;//静态变量的
	a++;
	printf("%d ", a);
}

int main()
{
	int i = 0;
	while (i < 10)	{
		test();
		i++;
	}

	return 0;
}

答案是这样的:
请添加图片描述

  1. static 修饰全局变量
    在C语言中,全局变量具有外部链接属性,在一个项目的其他源文件中,我们只要用extern关键字声明这个全局变量,那这个全局变量就能在这个源文件中使用。
    而我们用static修饰了全局变量后,它的外部链接属性改为了内部链接属性,于是这个全局变量只能在自己所在的源文件下使用了

  2. static 修饰函数
    类似与全局变量,函数也拥有外部链接属性,在其他源文件中被extern声明后可以被使用,而在函数所在源文件函数被static修饰后,它只能在它自己所在的源文件下使用了

12.3 define 定义常量和宏

定义宏其实和定义函数差不多

//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
    int sum = ADD(2, 3);
    printf("sum = %d\n", sum);
    
    sum = 10*ADD(2, 3);
    printf("sum = %d\n", sum);
    
    return 0;
}

define 定义标识符常量以前讲过,在上面这段代码中,define定义了一个宏,内容是简单的两数相加

#include <stdio.h>
#define ADD(x, y) ((x)+(y))//宏
int Add(int x, int y)//函数
{
	return x + y;
}

int main()
{
	int a = 10;
	int b = 20;
	int c = ADD(a, b);
	printf("%d\n", c);

	int d = Add(a, b);
	printf("%d\n", d);

return 0;
}

这段代码中c 和 d 的答案都是30,宏和函数所表达的内容是一致的

13. 指针

要学习指针,就得理解内存
内存是电脑上重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分为一个个内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。

我们把内存比喻成宿舍楼,每个房间就是这样的内存单元,这样的房间占1个字节,而宿舍楼管那里有一本记事本,记录着到每个房间的路线,也就是每个房间的地址,这个地址就是指针

int main()
{	
	int a = 6;
  	return 0;
}

在这里a是 int 整形变量,所以向内存空间索要了4个字节的内存空间,也就是4个内存单元

#include <stdio.h>
int main()
{
	int a = 6;//虽然a占有4个字节,但是当我们&a的时候,拿到的是4个字节中第一个字节的地址
	printf("%p\n", &a);
	return 0;
}

%p是以地址的形式打印
这里a占有4个字节,也就是四个内存单元,相应的有四个内存编号,但是打印只打印第一个内存单元编号。

我们再加一段代码:

#include <stdio.h>
int main()
{
	int a = 6;//虽然a占有4个字节,但是当我们&a的时候,拿到的是4个字节中第一个字节的地址
	int * pa = &a;//这里的pa是一个变量,我们把a的地址存放在了里面,叫指针变量
	*pa = 7;//解引用操作符
	printf("%d",a);
	return 0;
}

指针变量意为存放地址的变量;
这里的 * 是在说明pa是指针变量,而前面的 int 实在说明 pa 指向的是一个整形;
在上面的代码中我们加了一句 *pa = 7;还记得吗,*是一个操作符,它被称为解引用操作符,这里的 *pa就是a的意思,所以这段代码的答案显而易见 a = 7;请添加图片描述
注意:
32位机器上,地址是32个二进制位,地址要存储的话要四个字节,所以32位机器上指针变量的大小是4个字节;而64位机器上,指针变量存储的字节数是8个字节

14.结构体

结构体是C语言中非常重要的知识,它能描述那些复杂的对象,这里简单认识一下。

 struct Stu
{
    char name[20];//名字
    int age;      //年龄
    char sex[5];  //性别
    char id[15]; //学号
};
#include <stdio.h>
int main()
{
   
    struct Stu s1 = {"张三",20,"男","2022323"};
    printf("%s %d %c %s",s1.name,s1.age,s1.sex,s1.id);
	return 0;
}

输出语句中s1.name中有个点,你可以把它理解为“xx中的xx”,这句就可以理解为结构体s1中的name项。

今天的文章就到这里啦~
我是Dz,我们下期再见~

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值