C语言初识(二)
前言
上篇文章讲了一些基础知识,以及计算机语言的一些发展,介绍了数据类型,第一个C语言程序,变量和常量(在本篇继续补充,没介绍完)。
相信大家对C语言有了一些认识,我也有了很深的体会,对于C语言也有了一些以前没有的认知。
我们接下来继续学习介绍。
目录
前言
文章目录
四、变量、常量(补充)
(5)变量的作用域和生命周期
(6)常量
五、字符串+转义字符+注释
(1)字符串
(2)转义字符
六、注释
七、选择语句
八、循环语句
(1)while语句
四、变量、常量(补充)
(5)变量的作用域和生命周期
作用域
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效(可用有效的),而限定这个名字的可用性的代码范围就是这个名字的作用域。
1、局部变量的作用域是变量所在的局部范围。
2、全局变量的作用域是整个工程。
我们来举一个例子:
#include <stdio.h>
int main()
{{int a = 1;}printf("%d\n",a);return 0;
}
这里的代码,会出现错误,a打印不出来,这里a是局部变量,而a在第一个大括号内,出来了就不可以,这就是作用域。俗话来说就是只有在作用域内才可以运行。一个大括号就代表一个代码块。
就像租公寓,一个大房子,里面好几个屋子,而你只租了一间屋子,那就是属于你活动的地方,也就是你的自己的作用域。
全局变量在大括号外写就是,例如下面的代码:
#include <stdio.h>
int b=2;
int main()
{printf("%d\n",b);return 0;
}
我们这里打印b,程序一运行就打印出来了b的值,所以这个全局变量就可以在任意函数或者代码主函数内部使用,但注意,代码进行扫描的时候,是从头到尾进行扫描,有些复杂的代码只要沉住气,一句句读下去,就会理解。
如果在后面定义全局变量,要先声明,一般定义变量或者常量的时候都写在最前面,非必要时刻不要定义在后面。
生命周期
变量的生命周期是指的是变量的创建到变量的销毁之间的一个时间段。
1.局部变量的生命周期是进入作用域生命周期开始,出作用域生命周期结束。
2.全局变量的作用域是整个工程。
可以看看下面的例子进行理解:
#include <stdio.h>
int mian( )
{{int a = 666;printf("%d\n" , a);}printf("%d\n" , a);return 0;
}
这个代码和刚才的一样,这里变量a的值我们赋予666,通过刚才的了解我们知道他的作用域只在第一个大括号(代码块)里,所以第一个printf可以运行,第二个不可以运行,当赋予a666时后运行结束后,出来了第一个大括号后,a这个变量就没有用了,没有用了不能平白无故的消失,那不就闹鬼了,它实际上又把内存还给了计算机系统,就等于a这个变量还回去了,也就没了。所以局部变量a的生命周期就是进入这个作用域开始,出了作用域结束。所以第二个printf才不会有用,因为变量a这时候都已经还给内存了,都没有了还调用什么。
而对于全局变量来说,全局变量的作用域是主函数整个范围,主函数还是程序的生命周期,所以全局变量在真个主函数范围内都可以使用,它的生命周期也就是整个程序。
(6)常量
C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下几种:
字面常量
const 修饰的常变量
#define 定义的标识符常量
枚举常量
字面常量
字面常量,你写出数字,字符,字符串,浮点数都叫字面常量,从字面上直接写出的不能修改的就是字面常量。
const修饰的常变量
const修饰的常变量,在定义一个变量的时候,后面是可以修改这个变量的值的,比如前面定义一个整形变量a为999,那么完全可以在写一个赋值语句将a等于另一个值,这样a的值就会发生改变,而当在整形变量前面加上一个const的时候,这个变量就有了常属性,也就不能被修改,虽然此时不能被修改,但是编辑器还是认为它是一个变量,所以他叫常变量。我们可以验证是否为变量。如下:
const int n = 20;
int arr[n] = {0};
一般定义数组的时候,里面要求要写常量来说明数组里有多少个数量,如果里面是变量编辑器会报错让你写一个常量,这里我们给n加上了const,此时n具有了常量的性质,语法层面限制了n,不能被修改,但当我们编译的时候,还是会报错,编辑器还是会说你这个n应为常量值,应输入常量表达式,所以从这里就可以看出加上了const,它本质上还是变量,也完美的诠释了它为什么叫const修饰的常变量。
因为他本质上是变量,出了作用域后还是会被内存销毁收回的。
define定义的标识符常量
#define M 10
int mian( )
{int arr[M]={0};printf("%d\n",M);return 0;
}
可以看出define定义的是常量
枚举常量
枚举:一一列举,能把可能的值一一列举出来。
例如,血型,性别,三原色等等都可以一一列举,C语言中把这些都定义成枚举类型
enum Color //枚举
{RED, //0GREEN, //1BLUE //2
};
int main( )
{rnum COlor c=BLUE;return 0;
}
用enum来枚举,里面的RED,GREEN,BLUE就是枚举常量 ,用整形分别打印这三种颜色,编译器会自动将他们仨识别为0,1,2,他们三个是枚举类型Color的可能取值,同时也是常量,所以叫枚举常量。常量不可改动,所以它们是不可以修改的。后续还会继续详细了解。
五、字符串+转义字符+注释
(1)字符串
"hello boy\n"
这种又双引号(Double Quote)引起来的一串字符成为字符串字面值(String Literal),或者简称字符串。
字符串的结束标志是一个\0的转义字符,在计算字符串长度的时候\0是结束标志,不算作字符串内容。
int main( )
{char ch1[]={'a','b','c'};char ch2[]="abc"; return 0;}
定义两个数组,一个放字符,一个放字符串,有什么区别呢,通过F10监视ch1和ch2可以看见字符串末尾隐藏了一个\0,ch1有三个元素,而ch2有四个元素。C语言中字符串末尾都会隐藏一个\0,C语言设计的时候就是这样设计的,但你看不见。
我们通过打印字符串时,%s,是打印到\0为止,如果用%s打印上面的ch1和ch2,那么ch1因为没有\0,他打印完a,b,c之后会出现未知值,因为它没识别到\0,没识别到结束标志,而ch2则正常表示。
当我们求长度的时候,是不算\0的。
C语言提供了一个库函数,可以计算字符串的长度,统计的是\0之前字符的个数
strlen
string length
#include <stdio.h>
#include <string.h>
int main( )
{char ch1[]={'a','b','c'};char ch1[]="abc";int len2=strlen(ch2);printf("%d\n",len2);return 0;
}
我们刚才知道ch2里面有四个元素,但strlen 统计的是\0之前的元素个数,当用strlen来统计ch1的个数时,结果不是3,而是一个不是3的随机数(不同电脑不同数字),因为会一直往后继续访问,直道遇到\0,才会停止,当里面加上‘\0’后,它统计的个数才是3。
(2)转义字符
可以先举两个例子
int main( )
{printf("abndef"); //abndefprintf("abc\ndef"); //abc//defreturn 0;
}
先打印两句话,第一句不加\,第二句加上,结果发生了很大的变化,第一句正常输出全部,而第二句输出了两行,第一行是abc,第二行是def,会发现n消失不见了,发生了显著的变化。
所以,转义就是转变原来的意思。转义字符本质是一个字符,以下有一个转义字符的表格。
\? | 在书写多个问号时使用,防止他们被解析成三字母词 |
\' | 用于表示一个字符常量 ' |
\'' | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠 |
\a | 警告字符,蜂鸣,当打印这个时候计算机会响一下 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3国人八进制的数字。如\130 X |
\xdd | dd表示2个十六进制的数字。如\x30 0 |
三字母词,有些编辑器会识别,VS已经不识别了。如果出现这种情况,就可以用\来进行转义,让它意义改变,让他变回原来的意思。
??= | # |
??( | [ |
??) | ] |
??< | { |
??> | } |
??/ | / |
??! | | |
??' | ^ |
??- | ~ |
六、注释
1.代码中有些不需要的代码可以直接删除,也可以注释掉
2.代码中的有些代码比较难懂,可以加一下注释文字。
例如:
int mian( )
{//创建一个整形变量叫a,并赋值10int a = 10;return 0;
}
注释还是有用的,自己留下一些注释,时间长了回来一看,会更加容易上手和理解。
注释信息在编译时是不编译的,因为注释是给人看的,计算机只看没有注释的代码,早期注释风格是/*注释内容*/,也就是C语言注释风格,但这种会出现问题,它是不吃嵌套的,容易出错,C++风格的注释是在开始/,它可以注释一行或者多行,但可以用快捷键来注释,也同样比较方便。
七、选择语句
如果.........,那么..........
面临选择问题就是选择语句。可以看下面的if语句
int main( )
{int input = 0;printf("好好学习(1/0)?");scanf("%d",&input);if(input == 1)printf("OK\n");else if(input == 0)printf("NO\n");elseprintf("erro\n);return 0;
}
定义一个变量Input,让你选择0或者1,1的话会输出OK,0的话会输出NO,其它会输出erro,后续还会深入了解if语句,在这里只需要if语句其实就是个选择语句就可以。可以按自己的想法来实现选择分支。
八、循环语句
生活中有些事是一直在做的,比如吃饭,学习,走路。
代码也可以描述循环,循环也可以被打破。
C语言中有三种循环:
while 语句
for 语句
do... while 语句
(1)while语句
int main( )
{int line = 0;while( ){printf("敲代码\n");line++;}if(line > 2000)printf("OK\n");elseprintf("NO\n");return 0;
}
这里就用了一个while循环语句,当条件符合的时候也就是line值小于2000的时候,会一直输出敲代码,line的值会一直增加,后续用一个if else语句来实现选择结构,如果大于2000,则输出OK,如果不符合则输出NO。
后续会持续更新