初识C语言:从入门到精通(2)

简介: 第二篇对C语言基础知识的概要,适合入门级新手

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

变量、常量

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

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

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

1.1定义变量的方法:

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

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

1.2变量的命名:

  • 只能由字母(包括大写和小写)、数字和下划线(_) 组成。
  • 不能以数字开头。
  • 长度不能超过63个字符。
  • 变量名中区分大小写的。
  • 变量名不能使用关键字。(这里的关键字在后文中会有介绍)

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

1.3变量的分类:

  • 局部变量
  • 全局变量

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

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

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

#include<stdio.h>intc=30;         //全局变量intmain()
{
inta=10;     //局部变量intb=20;     //局部变量printf("a=%d\n", a );
printf("b=%d\n", b );
printf("c=%d\n", c );
return0;
}

1.3.1:特别注意:

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

我们用代码来验证一下

#include<stdio.h>inta=20;        //全局变量intmain()
{
inta=10;   //局部变量printf("a=%d", a);
return0;
}

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

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

1.3.2:变量的使用:

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

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

(1).输入输出语句:

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

(2).基本语法

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

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

我们用代码来演示一下

求两个数的和:

#include<stdio.h>intmain()
{
inta=0;
intb=0;
intsum=0;
printf("请输入两个整数\n");
//输入scanf("%d %d", &a, &b);    //这里注意:%d %d,表示在后面输入两个数的时候,中间要用空格隔开//计算                      //如果这里是 %d,%d,则输入两个数的时候中间要加上,sum=a+b;               
//输出printf("sum=%d", sum);
return0;
}

这个代码很好的给我们演示了两个数的相加,以及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字面常量:

intmain()
{
3.14;//浮点型常量55;//整型常量'a';//字符常量return0;
}

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

1.5.2const修饰的常变量:

intmain()
{
constintnum=10;
printf("%d\n", num);//10return0;
}

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

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

#define MAX 100      #include<stdio.h>intmain()
{
//MAX = 200;//errprintf("%d\n", MAX);  //100return0;
}

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

1.5.4枚举常量:

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

枚举关键字-enum

列出三原色:

enumColor{
RED,
GREEN,
BULE};
intmain()
{
enumColorcolor=RED;
return0;
}

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

#include<stdio.h>enumColor{
RED,
GREEN,
BLUE};
intmain()
{
enumColorcolor=RED;
printf("%d\n", RED);
printf("%d\n", GREEN);
printf("%d\n", BLUE);
return0;
}

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

字符串、转义字符、注释

2.1字符串:

"hello world.\n"

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

'A'

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

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

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

#include<stdio.h>intmain()
{
charch='a';              //表示字符chararr[] ="abcdef";  //表示字符串return0;
}

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

chararr1[]="abcdef";
chararr2[]= {'a','b','c','d','e','f','\0'};

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

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

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

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

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

#include<stdio.h>intmain()
{
chararr1[] ="abc";                     //这种默认有\0,所以打印到c就停止打印chararr2[] = {'a', 'b', 'c'};           //这种后面如果不加\0,则会有什么效果呢?printf("%s\n", arr1);
printf("%s\n", arr2);
return0;
}

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

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

#include<stdio.h>intmain()
{
chararr1[] ="abc";
chararr2[] = {'a', 'b', 'c','\0'};
printf("%s\n", arr1);
printf("%s\n", arr2);
return0;
}

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

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

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

用代码求字符串的长度:

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

在使用strlen函数时,要引用头文件#include<string.h>

#include<stdio.h>#include<string.h>intmain()
{
intlen1=0;
intlen2=0;
chararr1[] ="abc";
chararr2[] = { 'a', 'b', 'c','\0' };
len1=strlen(arr1);
len2=strlen(arr2);
printf("%d\n", len1);
printf("%d\n", len2);
return0;
}

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

2.2转义字符:

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

那我们该如何写代码呢?

#include<stdio.h>intmain()
{
printf("c:\code\test.c\n");
return0;
}

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

那这是为什么呢?

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

转义字符

释义

\?

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

\'

用于表示字符常量'

\''

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

\\

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

\a

警告字符,蜂鸣

\b

退格符

\f

进纸符

\n

换行

\r

回车

\t

水平制表符

\v

垂直制表符

\ddd

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

\xdd

dd表示2个十六进制数字

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

#include<stdio.h>intmain()
{
printf("c:\\code\\test.c\n");     //我们这里使用\\将\c,\t原本的意思转变return0;
}

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

2.2.1\ddd的意思:

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

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

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

#include<stdio.h>intmain()
{
chara=0;
a='\137';             //\137是一个字符所以放在''里面printf("%c\n", a);     //打印字符用%creturn0;
}

这里要注意:\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<stdio.h>intmain()
{
chara=0;
a='\x78';
printf("%c\n", a);
return0;
}

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

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

#include<string.h>          //使用strlen函数要包含头文件#include<stdio.h>intmain()
{
chararr[] ="c:\test\628\test.c";
intlen=strlen(arr);      //计算arr字符串的长度printf("%d\n", len);
return0;
}

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


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

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

注释

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

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

#include <stdio.h>intAdd(intx, inty)
{
returnx+y;
}
/*C语言风格注释int Sub(int x, int y){return x-y;}*/intmain()
{
//C++注释风格//int a = 10;//调用Add函数,完成加法printf("%d\n", Add(1, 2));
return0;
}

注释有两种风格:

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

缺陷:不能嵌套注释

C++风格的注释 //xxxxxxxx

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


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

目录
相关文章
|
2月前
|
C语言
C语言------程设设计入门
这篇文章是C语言程序设计的入门教程,涵盖了C程序的实现过程、VC集成开发环境的使用、基本数据类型的使用、格式控制字符的作用,以及通过示例代码演示了如何使用printf()函数输出不同类型的数据。
C语言------程设设计入门
|
2月前
|
NoSQL Java 编译器
C语言从入门到精通该怎样学?
持续学习与实践:编程是一门需要不断学习和实践的技能,要保持对新技术和新知识的敏感性,并持续进行编程实践。
39 1
|
3月前
|
存储 Java C语言
【C语言入门】初识C语言:掌握编程的基石
【C语言入门】初识C语言:掌握编程的基石
56 4
【C语言入门】初识C语言:掌握编程的基石
|
3月前
|
存储 Java 程序员
【C语言入门】C语言入门:探索编程世界的基础概念
【C语言入门】C语言入门:探索编程世界的基础概念
70 2
|
3月前
|
前端开发 C语言 C++
C语言入门02---环境搭建
C语言入门02---环境搭建
|
3月前
|
编译器 C语言 C++
C++从遗忘到入门问题之C++持从C语言的过渡问题如何解决
C++从遗忘到入门问题之C++持从C语言的过渡问题如何解决
|
4月前
|
存储 Web App开发 算法
c语言的简单入门
熟悉c语言(简单入门)
|
4月前
|
JavaScript C语言
|
4月前
|
存储 人工智能 Java
|
4月前
|
存储 程序员 Go
下一篇
无影云桌面