·初识C语言
本章重点:
- 什么是C语言
- 第一个C语言程序
- 数据类型
- 变量、常量
- 字符串+转义字符+注释
- 选择语句
- 循环语句
- 函数
- 数组
- 操作符
- 常见关键字
- define定义常量和宏
- 指针
- 结构体
什么是C语言
C语言是一门计算机语言,计算机语言是人和计算机交流的语言,常见的有C/C++/JAVA/Python
语言的发展:(由低级语言到高级语言不断发展)
二进制语言 —— 硬件-电-正电/负电(即1和0) —— 10100001 – ADD – 助记符 – 汇编语言 —— B语言 —— C语言、C++(高级语言)
第一个C语言程序
- 新建文件
- 新建项目
- C++ Windows控制台
- 空项目
- (方案资源管理器)——源文件——右键 添加新建项
- C++文件
- 名称 xxx.c(.c源文件 .h头文件)
- 基本框架
int main()//主函数-程序的入口,必须有且只有一个
{
return 0;//零
}
- Ctrl+F5 运行,如果不起作用则Fn+Ctrl+F5
例:
#include <stdio.h>
int main()/
{
printf("Hello World\n");
printf( "你好,世界\n" );
return 0;
}
代码分析:
- int:整型的意思,main前的int表示main函数调用返回一个整型值(整型的意思是不含小数的数值,例如12、15、33)
- void main() 已经是过时的写法
- 打印函数:printf,由print(打印) + f(format,格式)组成,本身是库函数(C语言本身提供的函数)
用法:printf(“xxxx\n”) “\n”是换行
- 使用库函数:#include <xxxx.x>
std – 标准 standard input output
- 调试运行程序一闪而过,解决方法:
管理器里项目名称右键 —— 属性 —— 配置属性 —— 连接器 —— 系统 —— 子系统 —— 更改为控制台
- 运行到光标处:快捷键Ctrl+F10;逐行运行:F11
数据类型
char | 字符数据类型 |
short | 短整型 |
int | 整型 |
long | 长整型 |
long long | 更长的整型 |
float | 单精度浮点数 |
double | 双精度浮点数 |
- 为什么出现这么多类型?(大小不同,节省空间,类似于瓶、碗和桶的区别)
- 每种类型的大小是多少?
- 申请内存储存字符
例:
int main()
{
char ch = 'A';//向内存申请一个名为ch的空间用来储存A
//单引号引起字符,双引号字符串;输出字符%c,字符串用%s
printf("%c\n",ch);// %c——打印字符格式的数据
return 0;
}
%d | 打印整型十进制数据(如12、3、5) |
%c | 打印字符(如A、汉字、符号等等) |
%f | 打印浮点数字(如0.8、12.6) |
%p | 以地址形式打印 |
%lf | 打印浮点数字(一般与double对应使用) |
- 计算机能够申请的空间
int main()
{
printf("%d\n", sizeof(char));//1字节
printf("%d\n", sizeof(short));//2字节
printf("%d\n", sizeof(int));//4字节
printf("%d\n", sizeof(long));//4或8字节
printf("%d\n", sizeof(long long));//8字节
printf("%d\n", sizeof(float));//4字节
printf("%d\n", sizeof(double));//8字节
return 0;
}
char(1) < short(2) < int = long = float(4) < long long=double(8) 单位:字节
其中long可以为4或8,C语言标准规定sizeof(long)≥sizeof(int),在不同的语言中long为4或8都满足这个条件
计算机中的单位:bit < byte < kb < mb < gb < tb < pb……
正电:1 负电:0 其单位是bit,是计算机中最小的单位,正负电的储存空间都是1bit(即二进制位的储存空间都是1bit)
8bit = 1byte 1024byte = 1kb 1024kb = 1mb 1024mb = 1gb……
分析:010转换为二进制是多少
将010拆分为 0*2^2 + 1*2^1 +0*2^0 = 0 + 2+ 0 =2
所有010转换为二进制是2
常量、变量
在生活中,有些值是不变的(如圆周率、身份证号码和血型等);有些值是可变的(如年龄、体重和薪资等)。
不变的值,C语言中用常量的概念来表示,变的值C语言中用变量来表示。
定义变量的方法
类型 + 变量名,赋予一个值(如 short age = 20;)
例:
int main()
{
short age = 20;//向内存申请2个字节=16bit位,用来存放20
float weight = 132.6f;//这里插入f的原因是系统会认为将双精点数放在了单精点中,会产生警告,这时候加入f可以解决这个问题
printf("年龄:%d\n 体重:%f\n", age,weight);
return 0;
}
变量的分类
- 局部变量
- 全局变量
例:
int global = 2019;//全局变量-定义在代码块“{}”之外的变量
int main()
{
int local = 2018;//局部变量-定义在代码块“{}”内部的变量
//下面定义的global会不会有问题?
int global = 2020;//局部变量
printf("global=%d\n", global);
return 0;
}
输出结果为2020,由此可见,当全局变量和局部变量名字相同时,优先局部变量。因此,全局变量和局部变量最好不要相同命名。
输入数据——使用输入函数:scanf
取地址符号:& (类似于门牌号,是找出数据所在位置用)
例:
//计算两个数的和
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0; //C语言语法规定,变量要定义在当前代码块的最前面
scanf("%d%d", &num1, &num2);//这里可能会出现“返回值被忽略:‘scanf’,在开头设置#pragma warning(once:4996)即可,或搜索C6031查找其它解决办法”
sum = num1 + num2;
printf("sum=%d\n", sum);
return 0;
}
tips:视图——解决方案管理器
变量的作用域和生命周期
作用域
作用域(scope),程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的。
而限定这个名字的可用性的代码范围就是这个名字的作用域。
- 局部变量的作用域是变量所在的局部范围;
- 全局变量的作用域是整个工程。
声明标识符(同一工程下另一源文件数据引用)
例:extern int xxxx;
extern 声明外部符号,引用的必须是全局变量作用域
生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期是:整个程序的生命周期。
常量
C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下几种:
- 字面常量(比如说3、4、5直接写出来的值而不是以赋值的形式写出来)
- const修饰的常变量(当定义的赋值前加上关键词const如“const int num = 4;”则意味着这个num不能变化)
注意:变量(如a、n、b等等)不能用于数组申请的空间,即使是有const修饰也不行,修饰后的n是有常属性的变量,所以是常变量。例:int arr[n]={0};×不成立
- #define定义的标识符常量
注意:const定义的是将一个变量赋予常属性,只能当做常量表示,不能当常量用,而define是直接定义一个常量,能当常量用
- 枚举常量(如性别女、男、其它,星期一到星期日,三原色红黄蓝)
直接定义了多个常量,用#define只能一个一个定义,相对来说更简便
关键词:enum。枚举常量有值且默认顺序为0,1,2,3……
例:
enum SEX
{
feamle,
male,
another
};
//female、male、another是枚举常量,其默认值分别是0、1、2
int main()
{
enum SEX s = feamle;
return 0;
}
字符串+转义字符+注释
字符串
“Hello World\n”
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注:字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算做字符串内容。
如”xxxx”,其包含的不仅仅只有xxxx,还有一个\0,也就是’a’ ’b’ ’c’ ’\0’(这里的’\0’的数值是0)。
‘\0’:字符串的结束标志(转义字符)
0:数字0
‘0’:字符0,属于一个字符,ASCII码值为48
例:
int main()
{
char arr1[] = "abc";//数组
char arr2[] = { 'a','b','c',’\0’ };//这里的0就相当于音乐中的休止符,不加上的话意味着打印继续,故会出现乱码
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
计算字符串长度——strlen(string length)
例:
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a','b','c'};
printf("%d\n", strlen(arr1));//strlen——计算字符串长度
printf("%d\n", strlen(arr2));//由于这里arr2末尾没有0所以持续往后计算,导致结果是随机值
return 0;
}
转义字符
转变原来的意思。比如“n”加上斜杠后变为“\n”,意思是换行。
转义字符 | 释义 |
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词(vs编译器用不到) |
\’ | 用于表示字符常量’ |
\” | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制的数字。如:\130 X |
\xdd | dd表示2个十六进制的数字。如:\x30 0 |
例:
int main()
{
printf("%d\n", strlen("c:\test\32\test.c"));
//这里的\32是2个八进制的数字
//32作为八进制代表的那个十进制数字,作为ASCII码值,对应的字符
//32 ——>转换为十进制是26 ——>作为ASCII码值代表的字符
return 0;
}
注释
注释有两种风格:
- C语言风格的注释:/*xxxx*/
缺陷:不能嵌套注释,正常不太用
- C++风格的注释://xxxx
可以注释一行也可以注释多行
注释快捷键:ctrl + k + c 注释;ctrl + k + u 取消注释。
选择语句
int main()
{
int input = 0;
printf("你要学习英语还是德语?(1/0)>:");
scanf("%d", &input);
if(input==1)
printf("你选择了英语\n");
else
printf("你选择了德语\n");
return 0;
}
循环语句
C语言中如何实现循环呢?
- while语句-讲解
- for语句
- do…while语句
例:
int main()
{
int line = 0;
printf("内容1\n");
while(line<200)
{
printf("内容2:%d\n", line);
line++;
}
if (line >= 200)
printf("内容3\n");
return 0;
}
函数
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", & num1, &num2);
sum = num1 + num2;
printf("sum=%d\n", sum);
return 0;
}
上述代码,写成函数如下:
int add(int x, int y)
{
//此处大括号内的内容为函数题
int z = x + y;
return z;
}
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
//函数
//f(x)=2*x+1;
//f(x,y)=x+y;
scanf("%d %d", &num1, &num2);
sum = add(num1, num2);//此处的add为函数
printf("sum = %d\n", sum);
return 0;
}
上述的Add就属于是自定义函数
函数的特点就是简化代码,代码复用。
数组
要储存1-10的数字,怎么存储?
C语言中给了数组的定义:一组相同类型元素的集合
数组定义
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//定义一个整形数组,最多放10个元素
//1-10的下标分别是0,1,2,3……9
printf("%d\n", arr[4]);//用下标的形式访问元素,这里访问的是下标是4的元素
return 0;
}
调试——窗口——监视 检查代码运行
数组的使用
数组是通过下标来使用的
例:
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
操作符
此处不重点讲述,后续会深入。
算术操作符 | + | - | * | / | % | |||||
移位操作符 | >> | << | ||||||||
位操作符 | & | ^ | | | |||||||
赋值操作符 | = | += | -= | *= | /= | &= | ^= | |= | >>= | <<= |
算术操作符 % :取模
具体案例:
int main()
{
int a = 5 % 2;
printf("%d\n", a);
return 0;
}