初识C语言:从0开始,由菜鸟变大牛(2)

前面我们讲了什么是C语言、第一个C语言程序、数据类型,接下来我们再来学习一点新的东西,同样,知识也是点到为止,对C语言有一个初步的了解。

    • 变量、常量

在我们日常生活中,通常有一些值是不变的(类如:圆周率、性别,身份证号码、血型...等等)

还有一些值是可变的(比如:年龄、体重、薪资)

在C语言中用常量来表示这些不变的值,用变量来表示这些可以改变的值。

1.1定义变量的方法:

数据类型 + 变量名 = 对其进行赋值;

int a = 0;  //这里对其赋值0,表示对a进行初始化
//一个人的年龄
int age = 18;
//一个人的身高
float high = 1.75f;   //这里要注意:在VS编译器里面小数类型默认是double类型
                       //在其后面加上f将其改变为float类型
//表示一个字母
char ch = ‘A’;

1.2变量的命名:

  • 只能由字母(包括大写和小写)、数字和下划线(_) 组成。

  • 不能以数字开头。

  • 长度不能超过63个字符。

  • 变量名中区分大小写的。

  • 变量名不能使用关键字。(这里的关键字在后文中会有介绍)

注:变量的命名要有实际意义

1.3变量的分类:

  • 局部变量

  • 全局变量

局部变量指的是在一个函数内部定义的变量;

全局变量也称做外部变量,指的是函数外部定义的变量,可以被本程序所有对象或者函数引用。

变量要定义在当前代码块的最前面。

#include
int c = 30;         //全局变量
int main()
{
    int a = 10;     //局部变量
    int b = 20;     //局部变量
    printf("a=%d\n", a );
    printf("b=%d\n", b );

    printf("c=%d\n", c );
    return 0;
}
初识C语言:从0开始,由菜鸟变大牛(2)_第1张图片

1.3.1:特别注意:

当局部变量和全局变量的名称冲突时,会发生什么呢?

我们用代码来验证一下

#include
int a = 20;        //全局变量
int main()
{
    int a = 10;   //局部变量
    printf("a=%d", a);
    return 0;
}

当全局变量和局部变量的名称发生冲突时,优先编译局部变量(当我们给变量命名的时候,尽量不要发生命名冲突的情况)

初识C语言:从0开始,由菜鸟变大牛(2)_第2张图片

这里可以看到,当局部变量和全局变量命名发生冲突时,优先编译的是局部变量。

1.3.2:变量的使用:

当我们创建一系列的变量时,我们要使用所创建的变量,该怎么使用呢?

在使用之前我们来了解一些新的知识:

(1).输入输出语句:

scanf 函数可用于输入,printf 函数可用于输出

(2).基本语法

scanf ("%d %d", & x, & y);

我们这里假设我们输入的数为整形,所以打印整形需要的是%d,假设我们所要输入的是两个数,后面就跟&x,&y,这里x和y表示所要输入的值,要注意 & 表示取地址的意思,当我们输入一个数,我们要把它存起来,就需要取它的地址进行储存。

我们用代码来演示一下

求两个数的和:

#include
int main()
{
    int a = 0;
    int b = 0;
    int sum = 0;
    printf("请输入两个整数\n");
    //输入
    scanf("%d %d", &a, &b);    //这里注意:%d %d,表示在后面输入两个数的时候,中间要用空格隔开
    //计算                      //如果这里是 %d,%d,则输入两个数的时候中间要加上,
    sum = a + b;               
    //输出
    printf("sum=%d", sum);
    return 0;
}
初识C语言:从0开始,由菜鸟变大牛(2)_第3张图片

这个代码很好的给我们演示了两个数的相加,以及scanf函数的使用

注:在VS这种编译器里面会对scanf函数进行警告,VS会感觉scanf函数不安全,它会建议我们使用scanf_s来替换scanf,但是,scanf_s只是VS里面所提供的,当我们将代码转移到其他编译器里面的时候,将不能编译,所以,scanf_s只能在VS里面使用,无法体现代码的跨平台性,那我们要解决这个问题,只需在我们的代码的第一行,#define _CRT_SECURE_NO_WARNINGS 1 ,就可以解决scanf函数警告。

1.4变量的作用域和生命周期:

作用域:

作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的而限定这个名字的可用性的代码范围就是这个名字的作用域。

1. 局部变量的作用域是变量所在的局部范围,也就是它只能在它所在的这个局部范围内起作用。

2. 全局变量的作用域是整个工程,只要是在这个工程里面,它都可以起作业。

生命周期:

变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段

1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。

2. 全局变量的生命周期是:整个程序的生命周期。

1.5常量:

C语言中的常量和变量的定义的形式有所差异。

C语言中的常量分为以下以下几种:

  • 字面常量

  • const 修饰的常变量

  • #define 定义的标识符常量

  • 枚举常量

1.5.1字面常量:

int main()
{
    3.14;//浮点型常量
    55;//整型常量
    'a';//字符常量
    return 0;
}

简而言之就是直接在代码块里面写出的常量。

1.5.2const修饰的常变量:

int main()
{
    const int num = 10;

    printf("%d\n", num);//10

    return 0;
}

const修饰的常变量之后,被const修饰的这个变量则在后面不能被修改,但是它在本质上还是一个变量,只是不能被改变了,并不能说是被const修饰之后就变为常量了,所以才叫做常变量。

1.5.3#define定义的标识符常量:

#define MAX 100      
#include
int main()
{
    //MAX = 200;//err
    printf("%d\n", MAX);  //100

    return 0;
}

#define定义的标识符常量也是不可以被修改的,在这个代码中,如果要修改MAX的值,则会出现错误。

1.5.4枚举常量:

可以一 一列举,但不可以改变的常量(比如,三原色,性别...等等)

枚举关键字-enum

列出三原色:

enum Color
{
    RED,
    GREEN,
    BULE

};
int main()
{
    enum Color color = RED;
    return 0;
}

我们来将枚举常量打印出来:

#include
enum Color
{
    RED,
    GREEN,
    BLUE

};
int main()
{
    enum Color color = RED;
    printf("%d\n", RED);
    printf("%d\n", GREEN);
    printf("%d\n", BLUE);

    return 0;
}
初识C语言:从0开始,由菜鸟变大牛(2)_第4张图片

我们可以看到,枚举常量的默认值是从0开始的,一次向下递增1的。

    • 字符串、转义字符、注释

2.1字符串:

"hello world.\n"

在C语言中:像这种由双引号引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。

'A'

在C语言中:由一个单引号引起来的叫一个字符。

//%s - 打印字符串
//%c - 打印字符

用代码来表示字符串和字符:

#include
int main()
{
    char ch = 'a';              //表示字符
    char arr[] = "abcdef";  //表示字符串
    return 0;
}

所以字符串有两种表示方法:

char arr1[]= "abcdef";
char arr2[]= {'a','b','c','d','e','f','\0'};

第一种表示方法:在这个字符串的最后面默认有一个\0

第二种表示方法:在这个字符串的最后面要加上\0

我们再来了解一个新的概念:\0

字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串的内容。

当我们知道了\0,我们来打印字符串看看效果:

#include
int main()
{
    char arr1[] = "abc";                     //这种默认有\0,所以打印到c就停止打印
    char arr2[] = {'a', 'b', 'c'};           //这种后面如果不加\0,则会有什么效果呢?
    
    printf("%s\n", arr1);
    printf("%s\n", arr2);
    return 0;
}
初识C语言:从0开始,由菜鸟变大牛(2)_第5张图片

我们可以看到,我们的字符串arr2中只有abc,但是为什么后面还有这么多奇怪的数字呢?

那是因为,我们没有加\0,所以,当打印字符串的时候,在打印完c之后没有遇到\0,所以就会一直打印一串随机的值,直到遇到\0才会停止打印,所以,在打印完c之后,再打印的值我们无法知道,是一串随机的值,arr1中的字符串后面默认就有一个\0,所以在打印完c之后,就会停止打印。

#include
int main()
{
    char arr1[] = "abc";
    char arr2[] = {'a', 'b', 'c','\0'};
    
    printf("%s\n", arr1);
    printf("%s\n", arr2);
    return 0;
}
初识C语言:从0开始,由菜鸟变大牛(2)_第6张图片

当在arr2中加上\0之后,我们打印的值就是我们所要的值。

当我们打印字符串的时候,打印到\0就停止

当我们求字符串长度的时候,也是要找到\0,统计的是\0之前出现的字符串个数

用代码求字符串的长度:

当我们求字符串长度的时候要用到库函数strlen

在使用strlen函数时,要引用头文件#include

#include
#include
int main()
{
    int len1 = 0;
    int len2 = 0;
    char arr1[] = "abc";
    char arr2[] = { 'a', 'b', 'c','\0' };

    len1 = strlen(arr1);
    len2 = strlen(arr2);
     
    printf("%d\n", len1);
    printf("%d\n", len2);
    return 0;
}
初识C语言:从0开始,由菜鸟变大牛(2)_第7张图片

可以看到arr1和arr2的长度都是3,这也就说明了在计算字符串长度时,也是遇到\0就停止计算,也就是说strlen函数在计算字符串长度时,只统计\0之前的字符串个数。如果不加\0,那得到的结果就是一个随机值。

2.2转义字符:

假如我们要在屏幕上面打印一个目录:c:\code\test.c

那我们该如何写代码呢?

#include
int main()
{
    printf("c:\code\test.c\n");
    return 0;
}

当我们运行起来的结果却大不相同

初识C语言:从0开始,由菜鸟变大牛(2)_第8张图片

那这是为什么呢?

是因为\后面跟的某一些字母、数字、符号合起来表示的是一种转义字符的意思,转义字符顾名思义就是转变意思,那我们来看一下常见的转义字符:

转义字符

释义

\?

在书写连续多个问号时使用,防止他们被解析成三字母词

\'

用于表示字符常量'

\''

用于表示一个字符串内部的双引号

\\

用于表示一个反斜杠,防止它被解释为一个转义序列符

\a

警告字符,蜂鸣

\b

退格符

\f

进纸符

\n

换行

\r

回车

\t

水平制表符

\v

垂直制表符

\ddd

ddd表示1~3个八进制的数字

\xdd

dd表示2个十六进制数字

我们了解了转义字符,我们再来打印一个目录:c:\code\test.c

#include
int main()
{
    printf("c:\\code\\test.c\n");     //我们这里使用\\将\c,\t原本的意思转变
    return 0;
}
初识C语言:从0开始,由菜鸟变大牛(2)_第9张图片

当我们使用\\将\c,\t的意思转义,我们就可以打印目录。

2.2.1\ddd的意思:

\ddd是一个转义字符,表示的意思:ddd转化为10进制时所表示的ASCII码值,其中ddd表示1~3个八进制的数字。

我们用一段代码来表示一下:

\137----137是一个8进制的数字,转化为10进制是95,95所表示的ASCII码值是 _

#include
int main()
{
    char a = 0;
    a = '\137';             //\137是一个字符所以放在''里面
    printf("%c\n", a);     //打印字符用%c
    return 0;
}
初识C语言:从0开始,由菜鸟变大牛(2)_第10张图片

这里要注意:\ddd,这里面的一定是8进制的数字,8进制的数字要小于8,比如:\138,这就是两个字符:\13 和8,所以打印的时候打印的是13转化为10进制所对应的ASCII码值和8.

2.2.2\xdd的意思:

\xdd是一个转义字符,表示的意思是dd转化为10进制所表示的ASCII码值,其中dd表示2个十六进制数字。

我们来打印一下\x78

这里的78是一个16进制的数,转化为10进制是120,120所表示的ASCII码值是x

#include
int main()
{
    char a = 0;
    a = '\x78';
    printf("%c\n", a);
    return 0;
}
初识C语言:从0开始,由菜鸟变大牛(2)_第11张图片

注:ASCII码值所表示的数的范围是有限的0~127,如果转化过后的值超过这个范围将不会打印出想要的结果。

说到这里,我们再来看一串代码:

#include          //使用strlen函数要包含头文件
#include
int main()
{
    char arr[] = "c:\test\628\test.c";
    int len = strlen(arr);      //计算arr字符串的长度

    printf("%d\n", len);

    return 0;
}

我们来计算一下这一串字符的长度,各位读者可以想一想这个结果是多少

初识C语言:从0开始,由菜鸟变大牛(2)_第12张图片

这个字符串的结果是14,我们来一起看一下:

初识C语言:从0开始,由菜鸟变大牛(2)_第13张图片

画的图有点挫,我们来将就的看一下,\t是一个转义字符算作一个字符,\62是类似于\ddd类型的转义字符也算作一个字符(这里的8不属于8进制的数字,所以是一个单独的字符

    • 注释

1. 代码中有不需要的代码可以直接删除,也可以注释掉

2. 代码中有些代码比较难懂,可以加一下注释文字

#include 
int Add(int x, int y)
{
    return x + y;
}
/*C语言风格注释
int Sub(int x, int y)
{
return x-y;
}
*/
int main()
{
    //C++注释风格
    //int a = 10;
    //调用Add函数,完成加法
    printf("%d\n", Add(1, 2));
    return 0;
}

注释有两种风格:

C语言风格的注释 /*xxxxxx*/

缺陷:不能嵌套注释

C++风格的注释 //xxxxxxxx

可以注释一行也可以注释多行(建议使用C++注释风格)

伙计们,本篇的分享就到此结束,感谢各位阅览,如果有什么不足或者是看不懂的地方可以留在评论区,感谢大家!

你可能感兴趣的:(C语言:从入门到精通,c语言,开发语言)