本章节的笔记只是对C语言的基础知识的一个小概括
详细的讲解笔记后续会细讲
C语言就是一门通用的计算机语言,广泛应用于底层开发。
#include
int main()
{
printf("hello world\n");
return 0;
}
说明:
- #include
是该程序的头文件,因为该函数运用到了printf()函数,所以需要引头文件。 - 接下来是一个main()函数,C语言有规定,一个完整的C语言程序由一个或多个函数组成,必须有且只有一个main()函数,其可以出现在程序任何位置,程序由此开始执行,也结束于此。
- printf()是一个标准输出函数。
- return 0的作用是向操作系统返回一个零值,表示程序正常执行完毕。
- char 字符数据类型
- short 短整型
- int 整型
- long 长整型
- long long 更长的整形
- float 单精度浮点数
- double 双精度浮点数
- unsigned int 无符号整型
- unsigned short 无符号短整型
- unsigned long 无符号长整型
- 以及更多
#include
int main()
{
printf("%d\n",sizeof(char));
printf("%d\n",sizeof(short));
printf("%d\n",sizeof(int));
printf("%d\n",sizeof(long));
printf("%d\n",sizeof(long long));
printf("%d\n",sizeof(float));
printf("%d\n",sizeof(double));
printf("%d\n",sizeof(long double));
return 0;
}
结果:
说明:
关于sizeof()的说明
(1)sizeof()的括号内的内容是不进行计算的
(2)sizeof()是运算符不是函数
(3)sizeof()运算符有以下两种格式
1.用于求得表达式的值所占内存的字节数,其格式如下:
sizeof 表达式
2.用于求得某种数据类型的量所占内存的字节数,其格式如下:
sizeof (表达式)
char ch = 'w';
float weight = 101.5;
int salary = 20000;
数学中常数的概念:常数是指固定不变的数值,比如圆周率、真空光速等。
数学中变量的概念:变量是指没有固定的值,可以改变其值,有字母符号来表示,比如y=f(x),x是自变量,y是因变量。
计算机中常量的概念:常量是指在程序运行过程中其值不能改变的量,比如数值和字符值本身就是常量。
计算机中变量的概念:变量是指在程序运行期间其值可以改变的量,比如前面的int a,a就是变量。
int age = 150;
float weight = 45.5f;
char ch = 'w';
#include
int global = 2019;//全局变量
int main()
{
int local = 2018;//局部变量
int global = 2020;//局部变量
printf("global = %d\n",global);
return 0;
}
总结:
当局部变量和全局变量同名的时候,局部变量优先使用
#include
int main()
{
int a=0,b=0,sum=0;
printf("请输入两个操作数:>");
scanf("%d%d",&a,&b);//输入函数
sum = a + b;
printf("sum = %d\n",sum);//输出函数
return 0;
}
说明:scanf()等函数使用时存在不安全,若使用VS提供的函数则会存在跨平台障碍,固应在源文件第一行写
#define _CRT_SECURE_NO_WARNINGS 1
由此来忽略函数存在不安全的警告或错误。
使默认有这句话的话应该打开VS2019的文件位置▶️Program Files (x86)▶️Microsoft Visual Studio▶️2019▶️Professional▶️在搜索框内搜vcprojectitems并点▶️右击newc++file,用Notepad++写上那句话并保存就可以每次默认忽略不安全问题。
作用域
作用域概念:一段程序代码中所用到的名字并不总是有效/可用 的 而限定这个名字的可用性的代码范围就是这个名字的作用域。
生命周期
生命周期概念:变量的创建到变量的销毁之间的一个时间段
常量的分类
#include
#define MAX 5+5//#define定义的 标识符常量,但凡MAX出现,那就相当于5+5(不是10)
enum Sex//枚举常量的应用,enum Sex就是一个类型
{
MALE,
FEMALE,
SECRET
};
int main()
{
52.4;//字面常量
const float a = 5;
//const 修饰的常量,经此常变量a将不可改变(a本质上仍然是变量,不可以放在数组的[]中),不然会报错
return 0;
}
字符串是由一对" "括起来的字符序列(包括转义字符),其结束标志是\0,计算字符串长度的时候 \0 是结束标志,不算作字符串,但是会占内存一个字节。
#include
//打印字符
int main()
{
char arr1[] = "Hello";
char arr2[] = {'H','e','l','l','o'};
printf("%s\n",arr1);//正常打印
printf("%s\n",arr2);//会有乱码,因为字符打印唯有遇到\0才会停止
return 0;
}
转义字符的概念:以’'开头的特殊字符序列,也是字符常量的一种,内存中占一个字节
转义字符 | 释义 |
---|---|
\‘ | 用于表示字符常量’ |
\“ | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符。 |
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制的数字。\130 就是X |
\xdd | dd表示2个十六进制数字。\x30 就是0 |
注释用于不需要的代码,可以注释掉或者代码比较难懂,可以加注释
分格:
1./*xxxxxx*/ 缺陷:不能嵌套注释
2.//xxxxxxxx 可以注释一行也可以注释多行,推荐
#include
int main()
{
int a = 3,b = 5;
if(a > b)
printf("%d",a);//运用if-else语句,输出较大值
else
printf("%d",b);
return 0;
}
//while循环的实现
#include
int main()
{
int i = 0;
while(i < 10)
{
printf("%d",i);
i++;
}
return 0;
}
#include
int Add(int a,int b)
{
return a + b;
}
int main()
{
int a = 0,b = 0,sum = 0;
scanf("%d %d",&a,&b);
sum = Add(a,b);
printf("%d",sum);
return 0;
}
函数的特点就是简化代码,方便代码的重复使用
数组的概念:一组相同类型元素的集合
int arr[10] = {1,2,3,4,5,6,7,8,9,10}
- 数组可以不完全定义,未定义的就算0
- 数组的[ ]中不可以是变量
- 数组的下标从0开始
#include
int main()
{
int i = 0;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
while(i<10)
{
printf("%d ",arr[i]);
}
return 0;
}
算术操作符 例如:+ - * / %
移位操作符 例如:>> <<
位操作符 例如:& ^ |
赋值操作符 例如:= += -= *= /= &= ^= != >>= <<=
单目操作符 例如:! - + & sizeof – ++ ~ (类型)
关系操作符 例如:> >= < <= != ==
逻辑操作符 例如:&& ||
条件操作符 例如:exp1 ? exp2 : exp3(exp1条件为真则执行exp2,为假则执行exp3)
逗号表达式 例如 :exp1, exp2, exp3, …expN(从左向右计算,整个表达式结果是最后一个表达式的结果)
下标引用、函数调用和结构成员 例如:[] () . ->
C语言提供的关键字,不能自己创建关键字
关键字不能做变量名
关键字 | 作用 | 关键字 | 作用 |
---|---|---|---|
auto | 声明自动变量 | extern | 声明变量是在其他文件正声明 |
short | 声明短整型变量或函数 | register | 声明寄存器变量 |
int | 声明整型变量或函数 | static | 声明静态变量 |
long | 声明长整型变量或函数 | volatile | 说明变量在程序执行中可被隐含地改变 |
float | 声明浮点型变量或函数 | void | 声明函数无返回值或无参数,声明无类型指针 |
double | 声明双精度变量或函数 | if | 条件语句 |
char | 声明字符型变量或函数 | else | 条件语句否定分支(与 if 连用) |
struct | 声明结构体变量或函数 | switch | 用于开关语句 |
union | 声明共用数据类型 | case | 开关语句分支 |
enum | 声明枚举类型 | for | 一种循环语句 |
typedef | 用以给数据类型取别名 | do | 循环语句的循环体 |
const | 声明只读变量 | while | 循环语句的循环条件 |
unsigned | 声明无符号类型变量或函数 | goto | 无条件跳转语句 |
signed | 声明有符号类型变量或函数 | continue | 结束当前循环,开始下一轮循环 |
break | 跳出当前循环 | default | 开关语句中的“其他”分支 |
sizeof | 计算数据类型长度 | return | 子程序返回语句(可以带参数,也可不带参数)循环条件 |
简单介绍几个:
typedef
typedef 类型定义,就是对类型的重命名
typedef unsigned int u_int;
//将unsigned int重命名为u_int,u_int变成了一个类型名
int main()
{
unsigned int num1 = 0;
u_int num2 = 0;//这一句起的作用和上一句是一样的
return 0;
}
static
static修饰局部变量
改变了局部变量的生命周期,本质上是改变了变量的存储类型,从存储在栈区到存储到静态区。
static 修饰全局变量
使得这个全局变量只能在自己所在的源文件内部可以使用,其他源文件不能使用。
static修饰函数
使这个函数只能在本源文件内使用,不能在其他源文件内使
#define MAX 100//define 定义标识符常量
#define ADD(x,y) ((x)+(y))//define 定义宏
#include
int main()
{
int sum = ADD(2,3);//5
sum = 10*ADD(2,3);//50
return 0;
}
#include
int main()
{
int num = 10;
int*ps = num;//num的地址存在了指针变量ps里
*ps = 20;//解引用ps,ps指向变量num,因此可以来改变num中的值
return 0;
}
指针大小在32位平台是4个字节,64位平台是8个字节
#include
struct Stu
{
char name[20];
int age;
char sex[5];
};
int main()
{
struct Stu s = {"张三",20,"男"};//结构体的创建和初始化
struct Stu*ps = &s;
printf("%s %d %s",s.name,s.age,s.sex);//结构体变量.成员变量
printf("%s %d %s",ps->name,ps->age,ps->sex);//结构体指针->成员变量名
return 0;
}