您的位置:首页 > 编程语言 > C语言/C++

初识C语言2

2021-02-02 04:17 741 查看

在上一篇中,对C语言的编译器进行了说明,并且着重讲述了如何使用VS,紧接着就讲述了如何写第一个C语言程序,然后依次介绍了数据类型,再之后就介绍了变量的定义分类和使用,有不清楚的可以去翻阅一下我的博客“初识C语言1”中的内容。

常量

今天我们接着上一次说,上一次说到了变量,可是我们的生活中不止有像年龄、身高、体重等会变的量,还有例如身份证号码、血型、圆周率等不变的量,C语言作为人类和计算机交流的语言也必须要涉足于这些量,所以在C语言中,我们把这些不能改变的量称之为常量。

常量的分类

在C语言中常量分为4类:字面常量、const修饰的常变量和#define定义的标识符常量以及枚举常量。
给出以下示例代码:

#include <stdio.h>
#define PI 3.14 //此时PI为#define定义的标识符常量,其值为3.14
enum Sex//定义枚举常量的枚举关键字enum
{
MAN,
FEMALE,
SECRET
}//此时MAN,FEMALE,SECRET为枚举常量,其值由系统分配,是不可改变的
int main()
{
3;//字面常量
100;//字面常量
const int num=4;//此时num是const修饰的常变量,其值为4在使用过程中不可变
}

代码是很简单的代码,带了注释,方便大家理解,在注释里面也分别标识了四种常量。
字面常量,就是直接给出的常量,例如:1,2,3,4,5,6,7等等,像上示例代码中的3和100等直接给出的常量均为字面常量。
const修饰的常变量,其是变量被const修饰之后就具有了常属性,其在编译中是按变量编译的,这和C++是有区别的,在C++中const修饰的常变量是一个常量。
#define定义的标识符常量,就我个人理解#define定义的标识符常量就是一种定义方式而已,在上示例代码中,PI就是此种常量,它的值为3.14是不可以改变的。
还有最后一种就是枚举常量,枚举常量就像列举法一样,把所有的量都一一列举出来,每一个列举出来的量,系统都会给其分配一个值,这个值是固定的,不可改变的,可以直接打印输出的。

字符串、转义字符和注释

字符串

前面我们介绍数据类型的时候介绍过字符型数据,但是在生活中我们经常会用到多个字符连在一起的字符串:

"Hello world!"

像上面示例代码中用双引号包起来的一串字符就是字符串,在C语言中我们可以用数组来储存字符串。

#include <stdio.h>//输入输出函数的头文件
#include <string.h>//求字符串长度的函数的头文件
int main()
{
char arr1[]="abc";//定义字符型数组保存字符串
char arr2[]={'a','b','c'};//定义字符型数组保存字符串
char arr3[]={'a','b','c',0};//定义字符型数组保存字符串
printf("arr1=%s\n",arr1);//输出字符串
printf("arr2=%s\n",arr2);//输出字符串
printf("arr3=%s\n",arr3);//输出字符串
//strlen--求字符串的长度的函数,是C语言库函数,在使用之前必须打招呼
printf("arr1字符串长度为:%d\n",strlen(arr1));//输出字符串长度
printf("arr2字符串长度为:%d\n",strlen(arr2));//输出字符串长度
printf("arr3字符串长度为:%d\n",strlen(arr3));//输出字符串长度
return 0;
}

示例代码运行结果如下:

通过上面运行结果,发现输出字符串的时候,arr2数组输出出现乱码的情况,而arr1和arr3输出的就是我们需要的结果,在输出字符串长度时,arr1和arr3字符串长度都是3个字节,而arr2的字符串长度却是15个字节,而arr2和arr3最主要的区别就是:arr3数组里面有(0),而arr2里面没有,这个0是至关重要的。
在C语言中字符串的结束标志是'\0',这个'\0'是一个转义字符(等会会说到)在计算字符串长度时,以'\0'为结束标志,其不算字符串的内容。而在ASCII码表中'\0'对应的就是十进制下的0。
所以在上述示例代码中,arr2中是没有结束标志的,arr3中有结束标志'\0',由于是字符型数组,所以数组中的内容在编译的过程中会按ASCII码将十进制0转换成'\0'故:arr3中是有结束标志的,在arr1中,虽然没有写'\0'但是双引号内的字符串都会默认最后有'\0'结束标志,故arr3和arr1均有字符串结束标志,在编译完成之后输出了我们想要的结果,而arr2中没有字符串结束标志,故其在输出过程中,出现了乱码,在输出字符串长度时是一个随机值,当读完数组元素后还会往下读,直到读到'\0'结束标志才停,故其输出的内容不是我们想要的结果,输出的字符串长度是随机值。

转义字符

转义字符,顾名思义就是改变意思的字符,我们来看一个示例代码:

#include <stdio.h>
int main()
{
printf("E:\class\test.c\n");
return 0;
}

运行结果如下:

我们本来是要打印一个目录的,结果运行结果不尽人意,主要是在编译的过程中,系统把'\t'当做转义字符(水平制表符)来编译了,才导致出现了截图的运行结果。
在C语言中还有不少转义字符,就是通过'\'和字符来组成的,出现这种情况我们通常要在'\'之前再加上一个'\'变成'\'(其实也是转义字符)来消除以上情况,可以将上述示例代码进行修改成如下代码:

#include <stdio.h>
int main()
{
printf("E:\class\test.c\n");
printf("E:\\class\\test.c\n");
return 0;
}

在运行的过程中出现了一个小插曲,我所写的代码文件被我的电脑管家误认为是***了。。

遇到这种情况大家不用着急,因为大部分的***都是人为编写的,所以各种杀毒软件对我们编写的代码文件都极为敏感,会出现一不小心就判断为***的情况,我们只需找回文件,之后将我们代码文件放入信任区即可。

将文件放入信任区之后我们就可以正常运行了。
运行结果如下:

在第5行代码中将'\'变成了'\'即可以正常的打印目录。
下表是常见的转义字符:

注释

代码中有不需要的代码可以删除掉,也可以注释掉;
代码中有比较难懂的代码可以加一些注释方便其他人阅读,以及后面自己查阅。
C语言注释:

/*111111111*/

其存在缺陷:不能嵌套注释

/*
1111111/*111111*/1111
*/

在上述示例代码中

框框里面的内容没有被注释,这是因为在C语言中当编译到

'/*'
后但凡遇到了
'*/'
就会结束注释,因此C语言风格的注释最大的缺陷就是不能嵌套注释。
C++注释:

//1111111111
//1111111111

可以注释一行也可以注释多行。
鉴于以上,在写代码过程我们通常使用C++注释,C语言注释用的少。

选择结构

在生活中我们会面临着各种各样的选择,C语言作为人类和计算机沟通的语言,也应该有相应的语句与我们日常生活中的选择相对应。在C语言中需要根据某一条件是否满足来决定是否执行指定的操作任务,或者从给定的两种或多种操作中选择其一,这样的结构叫做选择结构。
C语言中有两种选择语句:if语句和switch语句,初识C语言不做阐述,后面聊选择结构的时候细说。仅举个示例:

#include <stdio.h>
int main()
{
int i;
printf("是否有好好学习?(若有好好学习,请键入非零正整数;若没有好好学习,请键入0)\n");//给出选择
scanf("%d",&i);
if(i==0)//判断
printf("请好好学习\n");//一种选择下的结论
else
printf("真棒!请继续加油\n");//另一种选择下的结论
return 0;
}

两种不同选择时的运行结果如下:

上述示例代码的作用就是判断有没有好好学习,若有好好学习则键入一个非零正整数,输出'真棒!请继续加油',若没有好好学习则键入一个0,输出'请好好学习'。此选择结构采用了if选择语句。

循环结构

在生活中,我们每天都要吃饭,每天都要工作或者学习,我们会经常重复着同一件事情,在C语言中,也有相应的语句与之相对应。重复着同一个语句,这样的结构叫做循环结构。
C语言中循环语句有三种:while语句、for语句以及do...while语句,初识C语言不做阐述,后面聊循环结构的时候细说。仅以while语句为例来举一个示例代码:

#include <stdio.h>
int main()
{
int a=1;
while(a<=10)//结束循环的条件
{
//循环体
printf("%d\t",a);//'\t'转义字符(水平制表符)使其输出整齐
a=a+1;
}
printf("\n");//'\n'转义字符(换行)
return 0;
}

运行结果如下:

上述示例代码中运用了while循环来依次输出了1,2,3,4,5,6,7,8,9,10这十个数字。

函数

C语言程序是由语句构成的,而实现一个小功能的多个语句结合而成,给封装起来就变成了函数,函数的作用就是使程序简单化,防止重复使用同样的多行代码。
举个栗子:

#include <stdio.h>
int Max(int a,int b)//函数声明
{
if(a>=b)
return a;
else
return b;
}
int main()
{
int x,y,m,n,max;
printf("请输入两个正整数x,y:\n");
scanf("%d %d",&x,&y);
printf("请输入两个正整数m,n:\n");
scanf("%d %d",&m,&n);
max=Max(x,y);//调用函数
printf("x和y这两个数较大的是:%d\n",max);
max=Max(m,n);//调用函数
printf("m和n这两个数较大的是:%d\n",max);
return 0;
}

运行结果如下:

上述示例代码实现的功能就是依次键入两组数,每组数中有两个数字,输出每组数中的最大值,代码中输出最大值功能的代码被封装在自定义的Max函数中,后面通过调用Max函数来实现输出最大值功能。

数组

在我们数学中有集合的定义,也就是具有相同属性的事物的集合称之为一个集合,集合里面的每个事物称之为元素,在C语言中也有与之对应的定义----数组。
在C语言中:一组相同数据类型的元素的集合称之为数组。

数组的定义

在C语言中,数组的定义和变量定义差不多,看实例:

char arr[10];//定义了一个字符型数组
int arr1[3]={1,2,3};//定义了一个整型数组,并赋值

在上述实例中,arr是一个字符型数组,其容量为10,也就是说里面最多只能有10个元素,arr1为整形数组,并且其被赋值,里面有3个元素,3个元素的值依次为1,2,3。

数组的使用

在C语言中,我们通常通过访问下标来访问数组中的元素,使用循环结构来输出一个数组,例如:

#include <stdio.h>
int main()
{
int n=0;
int n1=0;
int arr[10]={1,2,3,4,5,6,7,8,9,10};//定义一个整型数组,元素个数为10,并赋值
//打印数组元素
while(n<=9)
{
printf("打印数组的第%d个元素:%d\n",n,arr
);//通过下标来访问数组元素,下标由0开始
n=n+1;
}
printf("数组所占字节大小:sizeof(arr)=%d\n",sizeof(arr));//sizeof是计算数据类型长度(单位是字节),是C语言的库函数,其头文件和printf函数的头文件相同
n1=sizeof(arr)/sizeof(arr[1]);//数组的元素个数=整个数组的数据类型长度/每个元素的数据类型长度
printf("数组中元素的个数:n1=%d\n",n1);
return 0;
}

运行结果如下:

在C语言中,是通过下标来访问数组元素的,下标是由0开始的,通过循环结构依次来访问数组元素,进而输出数组中各元素。

操作符

初识C语言不做阐述,后面聊操作符的时候细说。仅做简单介绍:

算术操作符

+      -      *      /      %

移位操作符(二进制基础上对位操作)

>>      <<

位操作符(二进制基础上对位操作)

&      ^      |

赋值操作符

=      +=      -=      *=      /=      &=      ^=      |=      >>=      <<=

单目操作符

!              逻辑反操作
-              负值
+             正值
&             取地址
sizeof      操作数的类型长度(以字节为单位)
~             对一个数的二进制按位取反
--             前置、后置--
++           前置、后置++
*              间接访问操作符(解引用操作符)
(类型)      强制类型转换

关系操作符

>
>=
<
<=
!=       用于测试“不相等”
==      用于测试“相等”

逻辑操作符

&&      逻辑与
||         逻辑或

条件操作符

exp   ?   exp2   :   exp3

逗号表达式

exp1,exp2,exp3,…expN

下标引用、函数调用和结构成员

[]      ()      .      ->

此篇结束

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: