C语言学习分享------了解C语言-上
1. 前言
2. 知识目录
2.1 数据类型
2.2 变量
2.2.1 定义变量的方法
2.2.2 变量的命名
2.2.3 变量的分类
2.2.4变量的作用域和生命周期
2.3 常量
2.4 字符串,转义字符,注释
2.4.1 字符串
2.4.2 转义字符
2.4.3 注释
2.5 选择语句
2.6循环语句
3.总结
1. 前言
这篇文章主要给大家分享基础的C语言知识,让我们对C语言有一个大概的了解,这篇文章会从循环和函数一直讲到指针和结构体,但是都是对于每个知识点的简单认识,不会详细的说明,就是告诉大家C语言有这个东西,在我们后面的学习(文章)中会给大家一一详解,这篇文章很长,知识点多,大家可以看目录按需阅读.现在正式开始我们C语言的学习.(分为两次讲解)
2. 知识目录
2.1 数据类型
首先我们来看看C语言的数据类型
char //字符数据类型 short //短整型 int //整形 long //长整型 long long //更长的整形 float //单精度浮点数 double //双精度浮点数
我们先来看看short,int,long类型,我们可以看见他们都是整型,整型就是整数的意思,从名字我们可以推断long类型存储的整型应该比
int类型要"长",那么这个"长"具体是指的什么呢?那我们不得不引出计算机中的单位.下图:
我们比较熟悉的单位有MB.GB,但是在计算机存储中的最小单位是比特位,比特位过了还有一个单位是字节,像我们熟悉的公司字节跳动的英文就为ByteDance.那么我们这个地方的int数据类型就占用4个字节,short类型占用两个字节,long类型占用8个字节,我们可以用sizeof这个关键字,sizeof可以计算变量和类型大小(单位为字节)
#include <stdio.h> 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)); //输出8 printf("%d\n", sizeof(long long)); //剩下的大家可以自己去验证 printf("%d\n", sizeof(float)); printf("%d\n", sizeof(double)); printf("%d\n", sizeof(long double)); return 0; }
注意:存在这么多的类型,其实是为了更加丰富的表达生活中的各种值。
类型的使用:这里的ch,weight,salary是我们自己取的变量名,可以取不一样的名字.
2.2 变量
生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)
有些值是可变的(比如:年龄,体重,薪资)。
不变的值,C语言用常量的概念来表示,可以变的值则用变量来表示.
2.2.1 定义变量的方法
这里的age,weight,ch这些变量初始化之后,是可以改变它的值的
2.2.2 变量的命名
我们说上面的age,weight都是变量名,是我们自己定义的,所以我们定义变量名时要遵守C语言的规则
值得注意的是C语言中对于大小写是十分敏感的,我们定义a和A是完全两个不一样的变量名,在使用时也要避免混淆
2.2.3 变量的分类
变量我们分为局部变量和全局变量.在我们大括号{}里定义的变量都是局部变量,包括main函数里,循环语句里面,自定义函数里创建的变量都叫局部变量
#include <stdio.h> int global = 2019;//全局变量 int main() { int local = 2018;//局部变量 //下面定义的global会不会有问题? int global = 2020;//局部变量 printf("global = %d\n", global); return 0; }
总结:1.上面的局部变量global变量的定义其实没有什么问题的!
2.当局部变量和全局变量同名的时候,局部变量优先使用.
3.关于局部变量和全局变量的更详细的解释我会在<<c和指针>>第三章详解说明.
2.2.4变量的作用域和生命周期
作用域:即变量起作用的区域
局部变量的作用域是变量所在的局部范围。(在{}内起作用,出了{}就销毁了)
全局变量的作用域是整个工程。
生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
全局变量的生命周期是:整个程序的生命周期。
2.3 常量
C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下以下几种:
字面常量
const 修饰的常变量
#define 定义的标识符常量
枚举常量
举个例子:
#include <stdio.h> //举例 enum Sex//枚举常量,如果不给MALE赋初始值,它默认为0(FEMALE为1以此类推),它只能初始化赋值(或者不初始化) { //初始化后再改变它的值会报错 MALE, //关于枚举的详解我们将放在后期的结构体当中 FEMALE, SECRET }; //括号中的MALE,FEMALE,SECRET是枚举常量 int main() { //字面常量演示 3.14;//字面常量 1000;//字面常量 //const 修饰的常变量 const float pai = 3.14f; //这里的pai是const修饰的常变量 pai = 5.14;//是不能直接修改的! //#define的标识符常量 演示 #define MAX 100//这里MAX被定义为常量100,以后的程序中出现MAX将自动替换为100,且不可修改 printf("max = %d\n", MAX); //枚举常量演示 printf("%d\n", MALE);
上面例子上的 pai 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面限制了
变量 pai 不能直接被改变,但是 pai 本质上还是一个变量的,所以叫常变量。
2.4 字符串,转义字符,注释
2.4.1 字符串
“hello world!”
这种由双引号引起来的一串字符称为字符串字面值,或者简称字符串。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串
内容。 我们来看看下面这段代码,来了解一下\n的重要性
#include <stdio.h> //下面代码,打印结果是什么?为什么?(突出'\0'的重要性) int main() { char arr1[] = "hangdian"; char arr2[] = {'h', 'd', 'u'}; char arr3[] = {'h', 'd', 'u', '\0'}; printf("%s\n", arr1); printf("%s\n", arr2); printf("%s\n", arr3); return 0; }
我们在编译器上打一下上面代码执行后会发现第一行打印出hangdian,第二行打印了hdu后,后面可能会出现烫烫烫,然后第三行会正常打印出hdu.我们发现只有第二行是由异常的,这时因为它在初始化字符串数组时只初始化了’h’,‘d’,‘u’,没有’\0’.所以当printf函数读到’u’时不会停止,它会一直往后走直到找到’\0’.我们还可以利用一些strlen函数来深入认识一下’\0’的重要性.(strlen函数是计算字符串长度的函数,遇见’\0’停止.单位是字节,返回一个整数,后期会详细解释)
#include <stdio.h> #include<string.h>//使用strlen需要包含的头文件 //下面代码,打印结果是什么?为什么?(突出'\0'的重要性) int main() { char arr1[] = "hangdian"; char arr2[] = { 'h', 'd', 'u' }; char arr3[] = { 'h', 'd', 'u', '\0' }; int a = strlen(arr1); int b = strlen(arr2); int c = strlen(arr3); printf(" %d\n %d\n %d\n", a, b, c); return 0; }
我们可以猜一下第一行打印出来是可能是8,因为hangdian一共8个字符.
第一行和第三行都是正常的结果(和前面printf一样),但是第二行给我们输出了一共35,注意这里的35是随机值,不同的电脑或者不同的编译器都会得到不同的答案,我这台电脑是走到第35个才找到’\0’.
2.4.2 转义字符
值得注意的是,在我们讲转义字符前我们就已经在printf函数中使用过 \n 这个用法,这个\n就是一共转义字符,它的意思是换行.还比如假如我们要在屏幕上打印一些东西 c:\code\test.c 我们该如何写代码?
如果我们直接这样打印
#include <stdio.h> int main() { printf("c:\code\test.c\n"); return 0; } 1
我们会发现屏幕上会出现这些东西:c:code est. c.和我们期望的不太一样,
这里就不得不提一下转义字符了。转义字符顾名思义就是转变意思。
下面看一些转义字符:
/? -----------在书写连续多个问号时使用,防止他们被解析成三字母词
\’ ------------用于表示字符常量’
\“ ----------- 用于表示一个字符串内部的双引号
\ ------------ 用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a ---------- 警告字符,蜂鸣
\b -----------退格符
\f ----------- 进纸符
\n ---------- 换行
\r ----------- 回车
\t ----------- 水平制表符
\v -----------垂直制表符
\ddd ----------d d d表示1~3个八进制的数字。 如: \130 表示字符X
\xdd ----------d d表示2个十六进制数字。 如: \x30 表示字符0
当我们了解了上面的转义字符后,我们现在就可以把c:\code\test.c打印在屏幕上了
值得我们注意的是C语言还给我们提供了不同的打印类型来帮助我们输出或输入需要的数据类型,如下:
// %c - 字符 // %d - 整型 // %s - 字符串 // %f - float // %lf - double // %p - 地址的打印
我们printf函数和scanf函数中输入的%d,%c的原因就来自于此.
2.4.3 注释
注释的作用:
代码中有不需要的代码可以直接删除,也可以注释掉
代码中有些代码比较难懂,可以加一下注释文字
这里对于注释的介绍我不做过多的解释,我们可以跳转到我之前写的博客中阅读(点击后面蓝字)<<C和指针>>问题探讨
2.5 选择语句
如果你好好学习,校招时拿一个好offer,走上人生巅峰。
如果你不学习,毕业等于失业,回家卖红薯。
这就是选择.
c语言中的选择语句有三个,分别是if语句,switch,和条件运算符 A?B:C
下面我们来实现一个简单的if选择语句:
#include <stdio.h> int main() { int coding = 0; printf("你会去敲代码吗?(选择1 or 0):>"); scanf("%d", &coding); if(coding == 1)//if后面括号内容为真就执行下面语句,为假就跳过下面语句到else { prinf("坚持,你会有好offer\n"); } else//就是coding不等于1的情况 { printf("放弃,回家卖红薯\n"); } return 0; }
再来看看switch语句的实现:
#include <stdio.h> int main() { int coding = 0; printf("你会去敲代码吗?(选择1 or 0):>"); scanf("%d", &coding); switch (coding)//coding为1就跳到case 1语句,为0就跳到case 0语句 { case 1: printf("你会有好offer"); break; case 0: printf("回家卖红薯"); break; } return 0; }
条件运算符的代码实现:
#include <stdio.h> int main() { int coding = 0; printf("你会去敲代码吗?(选择1 or 0):>"); scanf("%d", &coding); int ret = coding ? 5 : 10;//coding为真返回5,为假返回10 if (ret == 5) { printf("会有好offer"); } else if(ret==10) { printf("回家卖红薯"); } return 0; }
大家先做一个了解,详解我们会放在后面学习
2.6循环语句
C语言中的循环语句有while语句,if语句和do…while语句.我们这里先了解一下while语句,if语句和do…while语句我们放在后面讲解.我们先来用一段程序感受一下while语句的执行:
//while循环的实例 #include <stdio.h> int main() { printf("加入杭电\n"); int line = 0; while(line<=20000)//当line小于等于20000时我们会不断执行下面语句,当line大于20000时会跳出while循环 { line++; printf("我要继续努力敲代码\n"); } if(line>20000) printf("好offer\n"); return 0; }
上面这段代码会在打印20000个"我要继续努力敲代码"后打印"好offer"
3.总结
我们大概了解了一下从数据类型到循环语句的C语言基础知识,为我们后面的深度研究做一个铺垫,由于此模块内容较多,我们后面的函数,数组,操作符,关键字.指针和结构体等将会放在了解C语言-下中讲解.