目录
本章目标:
了解C语言的基础知识,对C语言有一个大概的认识。 每个知识点就是简单认识,不做过分详细讲解,后面会详细讲解。
本章重点内容如下:
- 什么是C语言
- 第一个C语言程序
- 数据类型
- 变量、常量
- 字符串+转义字符+注释
- 选择语句
- 循环语句
- 函数
- 数组
- 操作符
- 常见关键字
- define 定义常量和宏
- 指针
- 结构体
什么是C语言
C语言是一门计算机语言。
什么是计算机原因?
中国人交流用汉语,英国人交流用英语,人和计算机用什么交流?
我们直接在电脑上打印:print hello,它能理解并且打印hello吗?答案是不能。计算机只能识别机器码(0,1)所以我们和计算机怎么交流呢?—计算机语言,计算机能理解的语言,比如:C/C++/PYTHON/JAVA等。
计算机语言的发展史:
计算机是硬件,电路组成,只有高低电平(0/1),对于0,1组成的一串内容,我们是看不懂的,怎么办?使用一些助记符,比如ADD等,由此出现了汇编语言,后来又出现了B语言,C,C++等高级语言。
机器语言----->汇编语言----->高级语言
第一个C语言程序
1. 创建工程/新建项目
创建项目后,解决方案资源管理器 可能出现在页面的右边,我们可以自己更改资源管理器的停靠位置,鼠标左键点中解决方案资源管理器,拖动,屏幕上会出现如下画面,拖拽资源管理器时,你会看到这几个箭头,红圈内的图标就代表停靠在左边。想放在哪边就把鼠标箭头拖动到对应的位置
2.创建文件
.c 源文件
.h 头文件 head
3.写代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>//包含一个叫stdio.h的文件
//std:standard 标准 i:input o:output
//int---整型
//main前面的int表示main函数调用返回一个整型
int main() {
//main函数----主函数--程序的入口
//main函数必须要有 并且在一个项目中main函数有且只有一个
printf("hehe\n");
//printf:print function 打印函数
//printf:库函数 c语言本身提供给我们的函数
//别人的东西---要使用必须要跟人家打招呼 #include <stdio.h>
return 0;//返回0
}
//void main()这种写法已经过时了
4.运行代码
在VS2013下,如果运行代码控制台出现一闪而过的问题,解决办法:
项目属性----->配置属性----->链接器----->系统---->子系统------>选择控制台。
快捷键:运行代码ctrl+F5 / Fn+ctrl+F5
这里强调一下:main函数在C语言中是程序的入口,有且仅有一个
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void test()
{
printf("this is test function\n");
}
//test();//报错 main函数是程序的入口
数据类型
C语言有哪些数据类型?
//Char 字符类型
//Short(int) 短整型
//int 整型
//long 长整型
//long long 更长的整型
//float 单精度浮点型
//double 双精度浮点型
//。。。。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
//char 字符类型
char ch = 'A';//在内存中开辟一块空间,存放字符A
printf("%c\n",ch);//%c---打印字符格式的数据
int age = 20;
printf("%d\n",age);//%d -- 打印整型十进制数据
//%d 打印十进制整型
//%c 打印字符
//%f 打印浮点数
//%p 以地址的形式打印
//%x 打印十六进制
//%o 打印八进制
//%lf 打印双精度浮点数
float f = 3.0;
printf("%f\n",f);
printf("%.2f\n",f);//小数点后保留两位
double d = 3.14;
printf("%lf\n",d);
return 0;
}
为什么要有这么多类型?为什么要有这么多整型?
- 为了表达生活中各种类型的值
比如年龄使用整型比较合适,身高、体重使用浮点型比较合适,性别使用字符型比较合适 - 选择合适的数据类型,节约内存空间,提高内存利用率
比如年龄,没有人可以活到200岁,那么使用char类型(占用1个字节内存空间,范围是0-255)就可以满足条件了,没有必要使用占用内存更多的数据类型,这样就可以节省内存空间。
那么不同的数据类型占用多大的内存空间呢?
首先介绍计算机中的单位:
bit:比特位 ,计算机最小单位 ,存储一个二进制位
Byte:字节 ,计算机的最小存储单元 ,一个字节存放8个比特位
KB = 1024B
MB = 1024KB
GB = 1024MB
TB = 1024GB
PB = 1024TB
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
printf("%d\n",sizeof(char));//1byte
printf("%d\n",sizeof(short));//2
printf("%d\n",sizeof(int));//4
printf("%d\n",sizeof(long));//4 or 8
printf("%d\n",sizeof(long long));//8
printf("%d\n",sizeof(float));//4
printf("%d\n",sizeof(double));//8
//sizeof----操作符 计算变量/类型的大小,单位是字节
//C语言标准规定:sizeof(long) >= sizeof(int)
//所以在不同的编译器下sizeof(long)的值是不一样的
//只要sizeof(long)>=sizeof(int)即可
//32位机器是4,64位机器是8
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
short age = 20;//向内存申请2个字节=16bit,用来存放20
float weight = 48.5;
//编译时候可能会有警告 double到float进行截断,会有精度的丢失
//48.5默认是double类型
float weight = 48.5f;//表示48.5是float类型
return 0;
}
变量、常量
生活中有可能会变化的量,也有不会变化的量。
不会变化的量 - 常量
变化的量 - 变量
定义变量的方法
//类型 变量名;
int age= 28;
char sex = 'w';
float weight = 48.5;
局部变量、全局变量
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int num1 = 30;//全局变量 - 定义在代码块({})之外的变量
int main()
{
//int num2 = 10;//局部变量 - 定义在代码块({})之内的变量
int num1 = 10;
printf("%d\n",num1);//值是多少? 10
return 0;
}
总结:
局部变量和全局变量可以同时存在 ,当局部变量和全局变量的名字相同时,在函数内部优先使用局部变量
建议:局部变量和全局变量名字不要相同 - 容易产生误会,产生bug
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
//计算两个数字的和
int num1 = 0;//向内存申请4个字节的空间
int num2 = 0;
int sum = 0;
//输入数据 - 使用输入函数scanf
scanf("%d%d",&num1,&num2);
//&取地址符号,把两个数字分别放进两个地址中
sum = num1 + num2;
printf("sum = %d\n",sum);
return 0;
}
典型错误:
语法错误:缺少“;”(在“类型”的前面)
C语言语法规定:变量定义要在当前代码块的开头部分,
所以要把所有的变量声明放在最前面
貌似C99之后就没有这个问题了~
变量的作用域和生命周期
作用域
通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
简单来说就是:局部变量的作用域是在它所在的{}内部,出了这个{},就找不到这个变量了
全局变量的作用域是整个工程
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int global = 100;//全局变量作用域:整个工程,任何地方都可以使用
void test()
{
printf("%d\n",global);//100;
}
int main()
{
int num = 30;//局部变量
//变量的作用域
{
int age = 10;//变量age的作用域就在这个{}中
printf("%d\n",num);//30
}
//printf("%d\n",age);//报错 找不到age这个变量
printf("%d\n",num);//30
printf("%d\n",global);//100
return 0;
}
全局变量的作用域是整个工程,也就是在一个源文件中声明的变量,在其他源文件中可以使用,但是怎么使用呢?使用extern
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
int g_val = 2021;
//main.c
#include <stdio.h>
//使用extern来声明外部符号
extern g_val;//使用test.c中声明的变量g_val
int main()
{
//未声明的标志符
printf("%d\n",g_val);
return 0;
}
生命周期
1.局部变量的生命周期:进入作用域开始,出作用域结束;
2.全局变量的生命周期:整个程序的生命周期。
关于scanf函数使用的问题:
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
scanf("%d%d",&num1,&num2);
int sum = num1 + num2;
printf("%d\n",sum);
return 0;
}
这段代码会报如下错误:
scanf函数是C语言提供的,scanf_s不是标准C语言提供的,是VS编译器提供的,scanf_s尽量不要使用,当代码移植时,其他编译器是不认识scanf_s函数的,代码的可移植性差
怎么解决?
在源文件开头,使用define定义常量 :
#define _CRT_SECURE_NO_WARNINGS 1
但是每次手动添加该常量较为麻烦,找到VS编译器安装路径下的newc++file.cpp文件,写入#define _CRT_SECURE_NO_WARNINGS 1,若文件无法修改,复制出来一份,以记事本方式打开,写入#define _CRT_SECURE_NO_WARNINGS 1,保存后,覆盖原来的newc++file.cpp文件,以后每次添加源文件,会自动添加(或者以管理员身份打开vs,然后打开newc++file.cpp,写入#define _CRT_SECURE_NO_WARNINGS 1)。