您现在的位置是:首页 >技术教程 >初步了解c语言(三)网站首页技术教程
初步了解c语言(三)
注:此篇文章仅限初步了解,本小白后续会持续进行详解。
函数
数学的函数,给定不同的自变量,会有不同的因变量,c语言的函数与其很相似,是一个模块的代码,完成一个独立的功能。
例如: 写一个函数来实现一个加法。
#include<stdio.h>
//加法函数
int ADD(int x, int y)
{
int z = x + y;
return z;
}
int main()
{
int num1 = 0;
int num2 = 0;
scanf("%d %d", &num1, &num2);
//调用函数
int sum = ADD(num1, num2);
printf("sum = %d
", sum);
return 0;
}
📙一些对函数的大概解释:
函数拥有 简化代码,代码复用 的特点。
数组
📙数组的定义: 一组相同类型元素的集合。
数组的定义
例如: int arr[5];
表示 数组里面有 5 个元素,每个元素都是int 类型。对于数组,我们可以直接初始化,例如:int arr[5] = {1,2,3,4,5};
这样,数组里面的5个元素就是 1 ,2 ,3 ,4, 5 。
数组的下标
📙c语言规定:数组的每个元素都有一个从0开始的下标,数组是可以通过下标来访问的。
如何通过下标来访问呢❓
例如:
#include<stdio.h>
int main()
{
int arr[5] = {1,2,3,4,5};
printf("%d
", arr[1]);
return 0;
}
这里我们打印 arr[1] ,通过下标,我们可以访问到元素 2 ,自然打印结果就是 2 了。
操作符
(此处仅仅 简单解释,没有提到的操作符会在之后写)
算数操作符
+ - * / %
📘 / 计算后的结果是商。并且有两种除法,一个是整数除法,一个是小数除法。
- 整数除法 : 假如是 5 / 2 , 两个整数相除,会得到一个整数,即它的商,得到的结果自然就是 2 .
- 浮点数除法: 如果想让 5 /2的结果为 2.5 ,就必须执行浮点数除法,需要保证除数和被除数至少有一个是浮点数 。
例如 : 5.0 / 2 ; 5 / 2.0 ; 5.0 / 2.0
📘% 被称为取模操作符,也就是算余数。但是需要注意的是,它的操作数只能是整数,不可以是浮点数。 例如:可以 5%2,但是不可以 5% 2.0 。
移位操作符
>> <<
位操作符
& ^ |
这两部分的操作符 操作的是 二进制位,之后我会详细说明。
赋值操作符
= += -= *= /= &= ^= |= >>= <<=
= 即为赋值,例如:将 0 赋值给 a , a = 0;
.
+= 这种赋值是复合赋值,a = a + 1;
和a+=1;
意思是一样的。像-= ,*=…这些,其实都是类似的。
单目操作符
只有一个操作数
! - + & sizeof ~ – ++ * (类型)
单目操作符 | |
---|---|
! | 逻辑反操作 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度 |
~ | 对一个数的二进制取反 |
- - | 前置或后置- - |
++ | 前置或后置++ |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制转换类型 |
📙一些解释:
- c语言中,0为假,非0为真。
!可以逻辑反操作,将真变为假,将假变为真。例如:!0 —— 为真 ,结果是1,!2 —— 结果是假 ,为0. - sizeof是一个操作符,可以计算变量的大小,例如 sizeof(int) 或者sizeof(a) ,对于这种里面是类型的,相当于计算该类型创建的变量的大小,注意:计算变量的时候,()可以去掉,例如sizeof a,这也正好说明了sizeof是一个操作符,而不是函数(函数的()是不可以省略的),但是括号里面是类型的话是不可以的。
- 后置++,是先使用,后++,前置++,是先++,后使用
关系操作符
> >= < <= != ==
这些是用来判断大小关系的。
其中 >= 为 大于等于 ; <= 为 小于等于; == 用于判断相等 ;!= 用于判断不等。
逻辑操作符
&& ||
&& 为 逻辑与(并且) ,|| 为逻辑或(或者)。
条件操作符
exp1 ? exp2 :exp3
c语言中唯一的一个三目操作符(有三个操作数)。
例如:比较一个大小
int max = (firstNum > secondNum ? firstNum : secondNum);
逗号表达式
exp1, exp2, exp3, … expN
其实就是用逗号隔开的表达式。
从左向右依次计算,逗号表达式的结果就是最后一个表达式的结果。
例:
下标引用,函数调用和结构成员
[ ] () . ->
📙一点解释:
常见关键字
c语言中有大量的关键字,这些关键字都是语言本身预先设定好的,而且自己是不能创建关键字的。
📙一些解释:
- 局部变量是进入作用域自动创建,出了作用域自动销毁,所以局部变量本身前面是有个auto,不过很普遍,就直接省略了。
- void 可以作为函数的返回值 或 函数的参数 或 修饰指针。
- typedef 可以理解为类型重命名,例如:
typedef unsigned long ul;
int main()
{
unsigned long firstNum = 0;
ul secondNum = 0;
return 0;
}
相当于将unsigned long 又取了一个名字叫 ul ,上述两种创建变量的类型是一样的。
关键字static的使用
c语言中,static是用来修饰函数和变量的。
修饰局部变量
我们先看一个例子:
#include<stdio.h>
void test()
{
int num = 1;
num++;
printf("%d ", num);
}
int main()
{
int i = 0;
while (i < 5)
{
test();
i++;
}
return 0;
}
❗️结果
❗️监视窗口
我们让static修饰一下 num 看一看结果如何:
#include<stdio.h>
void test()
{
static int num = 1;
num++;
printf("%d ", num);
}
int main()
{
int i = 0;
while (i < 5)
{
test();
i++;
}
return 0;
}
❗️结果
❗️监视窗口
这个现象是如何产生的呢?
💫对于第一个代码,由于num是局部变量,当num出了作用域,该变量被归还给了操作系统,每一次调用test都会创建一个新的num 并被重新赋予 1.
💫对于第二个代码,我们将用static修饰num后,通过监视可以发现,在num出了作用域后仿佛并没有被销毁,保留了此次的执行结果,在下一次被调用的时候,不再重新创建num,而是直接使用上次执行之后的值。
💫值得注意的是(通过监控发现):对于被用static修饰后的num 在第4行就可以看到num的值和地址了,并且在后续执行中会直接跳过第5行(创建),可以见得——该变量并不是在执行过程中被创建的,而是在编译期间就分配好了内存并赋予了值。
💫static修饰的变量会在程序结束时还给操作系统。
但是原因是什么呢?
🌟我们可以将内存大概分为3个区域——栈区,堆区,静态区。
在static 修饰局部变量后,会使得变量的存储类型从栈区改变为静态区,使得这个静态变量的生命周期变长,直到程序结束时才会被销毁,但是作用域不变。
修饰全局变量
看个例子:
我们可以发现由于static修饰了num,程序报错了。
❔ 怎么回事呢❔
🌟全局变量具有外部链接属性,所以在其他源文件内部都可以使用,而static 修饰全局变量后,改变了这个全局变量的链接属性,由外部链接属性变为了内部链接属性从而使得这个静态变量只能在自己的源文件内部使用,不可以在其他源文件内部使用。
修饰函数
和全局变量几乎时一样的,都是由于static的修饰,使得从外部链接属性变为了内部链接属性。
关键字register的大概了解
register ——寄存器
仅仅有建议作用
电脑数据大概存放:
register int num = 0;
建议将数据放在寄存器中,但最终是否放在寄存器,由编译器自行判断。
#define定义常量和宏
定义标识符常量 例如:#define MAX 10
定义宏:
例如:
#define ADD(x, y) ((x)+(y))
// 名字 参数 实现体
如何使用:(例如实现加法)
#include<stdio.h>
#define ADD(x, y) ((x)+(y))
// 名字 参数 实现体
int main()
{
int num1 = 2;
int num2 = 10;
int sum = ADD(num1, num2);
printf("%d
", sum);
return 0;
}
注意:宏和标识符常量都是替换,int sum = ADD(num1, num2);
相当于 sum = ((num1)+(num2));
结构体
结构体可以描述一个复杂对象,关键字为struct。
例如:描述一个学生。学生有 名字,年龄,性别,学号这几个属性,我们就可以通过各种类型的数据结合在一起去描述学生等一系列的复杂对象。
例如:
struct stu
{
char name[20];
int age;
char sex[5];
char number[20];
};
注意:一个汉字是两个字符
使用:
#include<stdio.h>
struct stu
{
char name[20];
int age;
char sex[5];
char number[20];
};
int main()
{
struct stu s = { "张三",18,"男","123456789" };//初始化
printf("%s %d %s %s
", s.name, s.age, s.sex, s.number);
struct stu* p = &s;
printf("%s %d %s %s
", p->name, p->age, p->sex, p->number);
return 0;
}
💞结尾
之后的内容,本小白会持续更新,刚开始写博客,有不足的地方还请各位大佬多多指正,非常感谢!