黑马程序员————C语言基本语法(关键字、标识符、注释符、变量、Scanf函数)
第一讲 关键字
1、什么是关键字?
1) 关键字就是C语言提供的有特殊含义的符号,也叫做“保留字”
2) C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义
C语言关键字
auto局部变量(自动储存) |
break 无条件退出程序最内层循环 |
case switch 语句中选择项 |
char 单字节整型数据 |
const 定义不可更改的常量值 |
continue 中断本次循环,并转向下一次循环 |
default switch 语句中的默认选择项 |
do 用于构成do.....while循环语句 |
double定义双精度浮点型数据 |
else 构成if.....else选择程序结构 |
enum 枚举 |
extern 在其它程序模块中说明了全局变量 |
float 定义单精度浮点型数据 |
for 构成for循环语句 |
goto 构成goto转移结构 |
if 构成if....else选择结构 |
int 基本整型数据 |
long 长整型数据 |
register CPU内部寄存的变量 |
return用于返回函数的返回值 |
short短整型数据 |
signed有符号数 |
sizoef计算表达式或数据类型的占用字节数 |
static定义静态变量 |
struct定义结构类型数据 |
switch构成switch选择结构 |
typedef重新定义数据类型 |
union联合类型数据 |
unsigned定义无符号数据 |
void定义无类型数据 |
volatile变量在程序中执行中可被隐含地改变 |
while用于构成do...while或while循环结构 |
2、关键字的特征
第二讲 标识符
一、概述
1、什么是标识符
2、标识符的作用
3、命名规则
1)命名规则(一定要遵守)
- 只能由26个英文字母的大小写、10个阿拉伯数字0~9、下划线_组成
- 严格区分大小写,比如test和Test是2个不同的标识符
- 不能以数字开头
- 不可以使用关键字作为标识符
- 尽量起个有意义的名称,比如一个完整的英文单词,别人一看这个名称就能才能这个标识符的作用。如果不懂英文,你也可以用拼音,尽量不要起像abcde、sfsdfsdf等这类看起来没有意义的名称
- 如果标识符中含有多个单词,可以使用驼峰标识(除开第一个单词,后面每个单词的首字母都是大写):firstName、myFirstName,或者使用下划线_来连接:first_name、my_first_name
4、常见的标识符命名错误
fromNo12 from#12 标识符中不能使用#符号
my_Boolean my-Boolean 标识符中不能使用“-”符号,应使用下划线“_”代替
Obj2 2ndObj 标识符不能使用数字开头
myInt int “int”是内建关键字
jack_rose jack&rose 符号“&”不能出现在标识符中
GUI G.U.I 标识符内部不能出现“.”分隔符
第三讲 注释符
1、什么是注释
1)注释是在所有计算机语言中都非常重要的一个概念,从字面上看,就是注解、解释的意思
2)注释可以用来解释某一段程序或者某一行代码是什么意思,方便程序员之间的交流。假如我写完一行代码后,加上相应的注释,那么别人看到这个注释就知道我的这行代码是做什么用的
3)注释可以是任何文字,也就是说可以写中文
4)在开发工具中注释一般是豆沙绿色
2、单行注释
1)单行注释以两个正斜杠开头,也就是以//开头,只能注释一行,从//开始到这行的结尾都是注释的内容
2)任何地方都可以写注释:函数外面、里面,每一条语句后面
3、多行注释
多行注释以/*开头,以*/结尾,/*和*/中间的内容都是注释
4、注释符的作用
1)被注释的代码不会参与编译
2)检查代码的作用
3)排除错误
5、注释符的嵌套现象
1) 单行注释可以嵌套单行注释、多行注释
1 int main () 2 { 3 // 哇哈哈 // 呵呵呵 4 // /* fsdfsdf */ // sdfsdfsd 5 printf("单行注释可以嵌套单行注释、多行注释") ; 6 return 0 ; 7 }
2) 多行注释可以嵌套单行注释
1 int main () 2 { 3 /*// 作者:MJ // 描述:第一个C语言程序作用:这是一个主函数,C程序的入口点*/ 4 printf("多行注释可以嵌套单行注释") ; 5 return 0 ; 6 }
3) 多行注释不能嵌套多行注释
1 int main () 2 { 3 /* 哈哈哈 /*嘻嘻嘻*/呵呵呵 */ 4 printf("多行注释不能嵌套多行注释") ; 5 return 0 ; 6 }
4) 下面的写法是错误的
1 int main() 2 { 3 // /*哈哈哈*/ 4 printf("下面的写法是错误的") ; 5 return 0; 6 }
6、注释符的重要性
- 要养成写注释的良好习惯。绝大部分项目经理检查下属代码的第一件事就是看有没有写注释,也有很多公司的机试也会检查注释。
- 今天,你写了几百行代码,很高兴,做出了一个非常不错的功能,但是,忘了写注释。一个星期过后,你再回去看那一段代码,你可能完全看不懂了,这是很正常的 事。如果你写了注释,那情况就不一样了,注释可以帮助你回顾代码的作用。
- 你在某家公司待了1年多,写了10几万行代码,但是你不写一点注释。有一天你离职了,新的员工接手你做的项目,他首先要做的事情肯定是要读懂你写的代码。可是你一点注释都没写,10万行代码,全部都是英文,这会让这位新员工非常地蛋疼。每个人都有自己的思想,写代码的思路肯定是不一样的,看别人写的代码是件非常痛苦的事情,特别是没有注释的代码。你不写注释的做法会大大降低公司的开发效率。因此,所有的正规公司都非常重视注释。
第四讲 数据、常量、变量
一、数据
1、什么是数据
2、数据的分类
计算机中存储的数据可以分为两种:静态数据和动态数据。
1)静态数据
- 概念:静态数据是指一些永久性的数据,一般存储在硬盘中。硬盘的存储空间一般都比较大,现在普通计算机的硬盘都有500G左右,因此硬盘中可以存放一些比较大的文件。
- 存储的时长:计算机关闭之后再开启,这些数据依旧还在,只要你不主动删掉或者硬盘没坏,这些数据永远都在。
- 哪些是静态数据:静态数据一般是以文件的形式存储在硬盘上,比如文档、照片、视频等。
2)动态数据(临时数据)
- 概念:动态数据指在程序运行过程中,动态产生的临时数据,一般存储在内存中。内存的存储空间一般都比较小,现在普通计算机的内存只有4G左右,因此要谨慎使用内存,不要占用太多的内存空间。
- 存储的时长:计算机关闭之后,这些临时数据就会被清除。
- 哪些是动态数据:当运行某个程序(软件)时,整个程序就会被加载到内存中,在程序运行过程中,会产生各种各样的临时数据,这些临时数据都是存储在内存中的。当程序停止运行或者计算机被强制关闭时,这个程序产生的所有临时数据都会被清除。
3、数据的大小
2) 数据都有大小,静态数据就会占用硬盘的空间,动态数据就占用内存的空间
3) 数据越大,包含的0和1就越多,比特位和字节
4) 1 KB = 1024 B,1 MB = 1024 KB,1 GB = 1024 MB,1 TB = 1024 GB
4、C语言中的数据类型
二、常量
1、什么是常量
2、常量的分类
浮点型常量分为double和float两种数据类型
- double:双精度浮点型,其实就是小数。比如5.43、-2.3、0.0等(注意,0.0也算是个小数)
- float:单精度浮点型,也是小数,比double的精确程度低,也就是说所能表示的小数位数比较少。为了跟double区分开来,float 型数据都是以f结尾的,比如5.43f、-2.3f、0.0f。需要注意的是,绝对不能有10f这样格式的,编译器会直接报错,只有小数才允许加上f。
- 将一个数字(0~9)、英文字母(a~z、A~Z)或者其他符号(+、-、!、?等)用单引号括起来,这样构成的就是字符常量。比如'6'、'a'、'F'、'+'、'$'等
4)字符串常量
- 将一个或者多个字符用双引号("")括起来,这样构成的就是字符串常量。比如"6"、"男"、"哇哈哈"、"abcd"、"my_car4",其实printf("Hello World");语句中的"Hello World"就是字符串常量。
三、 变量
1、什么是变量
2、定义变量
定义变量的目的是:在内存中分配一块存储空间给变量,方便以后存储数据。
如果定义了多个变量,就会为这多个变量分别分配不同的存储空间。
变量类型 变量名;
1 int main() 2 { 3 //在main函数中定义几个变量 4 int i; 5 char c; 6 int a, b; 7 return 0; 8 }
- 变量名属于标识符
- 变量类型
- 不同类型的变量占用不同大小的存储空间。内存极其有限,分配适当的存储空间
- 约束变量所存放的数据类型(方便运算)
3、变量的使用
1) 赋值
- 往变量里面存点东西,就是赋值。赋值语句后带个分号;
1 i = 10; //把10赋值给i变量
注意:这里的等号=,并不是数学中的“相等”,而是C语言中的赋值运算符,作用是将右边的常量10赋值给左边的变量i
- 第一次赋值,可以称为“初始化”
- 初始化的两种形式
- 先定义,后初始化: int a; a = 10;
- 定义的同时进行初始化: int a = 10;
2) 修改
- 可以修改变量的值,多次赋值。每次赋值都会覆盖原来的值
i = 10;i = 20; //变量i最后的值是20
- 使用printf输出一个\多个变量的值
int a = 10, c = 11; 2 printf("a=%d, c=%d", a, c);
- double\float\char的输出,格式符的一些小技巧
1 double height = 1.55; 2 char blood = 'A'; 3 printf("height=%.2f, 血型是%c", height, blood); 4 // %d\%i是一个格式符(占位符),只能输出整数 5 // %f用来输出小数,默认是6位小数 6 //%c用来输出字符
- 简单的加减操作
int a = 10 + 20;
- 没有初始化时不要拿来使用(下面的写法是不建议的)
1 int score; 2 printf("score=%d", score);//未赋值,会输出一些乱七八糟的数字
3) 变量之间值的传递
- 可以将一个变量的值赋值给另一个变量
1 int a = 10; //把10赋值给a 2 3 int b = a; //把a 赋值给b
- 连续赋值
1 a = b = 10;//连续赋值
4、常见的错误
1)变量名相同int a = 10;int a = 12;
2)变量的作用域不对
1 int main() 2 { 3 { 4 int a =100; 5 } 6 printf("a=%d",a);//变量a内存空间已经被释放,就会报变量a未声明错误 7 return 0 ; 8 }
注意点:变量的作用域是从定义变量的那行代码开始,一直到所在的代码块结束。
第五讲 变量的内存分析、Scanf函数
一、变量的内存分析
1. 字节和地址
为了更好地理解变量在内存中的存储细节,先来认识一下内存中的“字节”和“地址”。
1)内存以“字节为单位”
0x表示的是十六进制
2)不同类型占用的字节是不一样的,数据越大,所需的字节数就越多
2.变量的存储
1) 所占用字节数跟类型有关,也跟编译器环境有关
2)变量实例
1 int b = 10; 2 int a = 20;
- 内存由大到小寻址,优先分配内存地址较大的字节给变量。b的内存地址比a大
- 每个变量都有地址:第一个字节的地址就是变量的地址
3)查看内存地址:
1 int a; 2 printf("a的地址是:%p\n", &a); 3 //&a: 取得变量a的地址 4 //%p输出地址
3> 注意
一个变量一定先进行初始化,才能使用
1 int a; 2 printf("a的值是:%d\n", a); 3 //上面的写法是不建议的,输出的是一些乱七八糟的数字
二、Scanf函数
1. 简介
这也是在stdio.h中声明的一个函数,因此使用前必须加入#include <stdio.h>。调用scanf函数时,需要传入变量的地址作为参数,scanf函数会等待标准输入设备(比如键盘)输入数据,并且将输入的数据赋值给地址对应的变量
2. 简单用法
1 int age; 2 scanf("%d", &age); //先定义一个变量来存放要输入的值
- scanf函数时,会等待用户的键盘输入,并不会往后执行代码。scanf的第1个参数是"%d",说明要求用户以10进制的形式输入一个整数。这里要注意,scanf的第2个参数传递的不是age变量,而是age变量的地址&age,&是C语言中的一个地址运算符,可以用来获取变量的地址
- 输入完毕后,敲一下回车键,目的是告诉scanf函数我们已经输入完毕了,scanf函数会将输入的值赋值给age变量
3. 其他用法
1)用scanf函数接收3个数值,每个数值之间用中划线-隔开
scanf("%d-%d-%d", &a, &b, &c);
3个%d之间是用中划线-隔开的,因此我们在每输入一个整数后都必须加个中划线-,比如这样输入,不然在给变量赋值的时候会出问题
- 注意:数值之间的分隔符是任意的,不一定要用中划线-,可以是逗号、空格、星号*、井号#等等,甚至是英文字母
//逗号分隔
1 scanf("%d,%d,%d", &a, &b, &c); // 输入格式:10,14,20
// 井号分隔
scanf("%d#%d#%d", &a, &b, &c); // 输入格式:10#14#20
// 字母分隔
1 scanf("%dx%dx%d", &a, &b, &c); // 输入格式:10x14x20
2) 用scanf函数接收3个数值,每个数值之间用空格隔开
1 scanf("%d %d %d", &a, &b, &c);
3个%d之间是用空格隔开的,我们在每输入一个整数后必须输入一个分隔符,分隔符可以是空格、tab、回车
4. 注意
scanf的第一个参数中不要包含\n,比如scanf(“%d\n”, &a); 这将导致scanf函数无法结束