【濡白的C语言】初学者-从零开始-2(常量,一维数组,转义字符)

目录

常量

字面常量

常变量

标识符常量

枚举常量

数组

字符串数组

        字符串结束标志\0

strlen函数

不完全初始化   

转义字符


常量

常量,当然与变量想法,变量可以赋值改变,那么常量就是无法改变的。而具体来说,常量主要的形式有四种,分别是,字面常量,常变量,标识符常量,枚举常量。

字面常量

        所谓字面常量,词如其名,就是字面上的常量,直接写出来的数字都是字面常量,例如最常见的赋值操作,就是将一个字面常量赋值给变。

#include<stdio.h>

int main()
{
    float  a   =    1.2;
    //    变量    字面常量
    return 0;
}

常变量

        欸,也许有同学会感到奇怪,常量,为什么能叫常变量呢?那他到底是常量还是变量呢?
        其实严格意义上将,常变量还是变量,但是相对与一般的变量而言它具有了一定的常量的属性。通常情况下,常变量由const在定义的时候修饰,如下:

#include<stdio.h>

int main()
{
    const float a = 1.2;   
    a = 1.44;
    return 0;
}

         而当我们试图运行上述代码的时候就会发现系统报错了!

         看一下系统给出的错误提示,说左值不可更改,似乎和之前变量不一样了。这就是const的作用,将一个变量设置为不可更改的,因此说常变量是具有一定常属性的,那为什么又坚持说他是变量呢?如下:

         可以看到当我们试图用常变量a来确定数组的大小时(稍后会讲到数组),系统再一次给出了报错,原因是数组大小的确定需要常量,而此处系统仍然将a视作变量,因此常变量还是变量。

标识符常量

让我们再来看一段代码:

         可以看出这次,系统将a判定为常量,此时a就是define修饰的常变量,不过说另一个名字也许大家听到过,叫做宏替换,也就是说,当系统运行到这里是,他看到的a不是a是被替换过的10,但是值得注意的是,宏替换只是替换,不计算,例如,同学们可以猜一下下面代码运行的结果是什么:

#include<stdio.h>

#define a 10 + 1

int main()
{
	printf("%d", a * 2);
	return 0;
}

        正确答案是12,让我们来研究一下,首先就像刚才说的,a是被替换成了10+1,那么printf打印的a*2 就相当于 10 + 1 * 2,是的,没有括号,并不会计算出11 * 2 ,相信这样大家能更好的理解替换二字 。

枚举常量

         枚举的关键字是enum,具体如上图,我们在枚举中的各个枚举常量和数组下标一样,都由0开始,因此实际上arr[third]相当于arr[2],而值得注意的是,枚举的时候不会开辟内存空间,而在main主函数中,enum sex me就是创建了一个枚举sex的变量me,此时会开辟空间。不过相对于上述三个变量而言,枚举常量一般利用很少,在此提出仅作为了解。

数组

        数组,定义来说,是一串相同类型的合集,出现这数组的原因,可以举一个简单的例子,假如我想要打印出十个整数,如果只用变量的话,那么就要a1,a2...a10总共十个变量,那么定义起来是否就复杂了呢?既然这十个都是整数,那么设置一个int类型的数组,我们只需要直到数组名,就能快速的进行赋值等一系列操作,只需要在设置一个变量,即可表示对应的元素,例如a[i]就表示数组中的第 i + 1个元素,如图:

         当我们想打印6的时候需要printf("%d", arr[5]),数组中第n个元素对应的下标就是n - 1,在定义数组的时候只能用常量来确定数组的元素个数,例如上图就应该定义为 arr[10],与数组下标可不同哦!

字符串数组

        在此介绍一种比较特殊的数组,字符串数组,对于字符数组,大家可能很容易理解,那么字符串其实和字符数组差不多,字符串的出现就是字符数组的快捷形式,例如下图:

         对于数组arr1,每一个字符都要打上单引号,但是如果定义为字符串数组,只需要在两侧加上双引号即可。但是字符数组和字符串数组之间还是有一定的区别,也许同学们已经注意到了,再上图中arr2定义的时候是5个元素,打印的时候arr1出现了乱码。
        首先解释为什么要定义五个元素
       
这是字符串所独有,原因在于字符串需要一个标志告诉计算机这个字符串的结尾在哪里,这个标志就是’\0‘,这也是一个字符,是字符串结束的标志,因此他就需要占用数组的一个元素,所以原本四个字符byte此时就需要加上一位。
        然后解释乱码出现的原因

        字符串结束标志\0

        这里就需要先解释一下%s的含义,这个是专门用来表示输入或打印字符串的,他的含义就是从一个地方开始,不断打印直到遇见了\0,而且不论输入还是打印,%s后面一定是一个地址,而这里要注意的就是数组的名字,就是数组第一个元素的地址,也就是’b'的地址,%s将从b开始一直向后读取,而对于arr1,数组中是没有结束标志\0的,因此系统会不断打印直到遇见\0,而下一个\0就是arr2的\0,因此乱码之后还打印了一次byte。

strlen函数

        在此介绍另一个函数,包含在string.h之下,作用是求字符串的长度,用法就是strlen(数组名),我们将利用这个函数更进一步了解字符串数组

     通过这段代码我们更加可以确当乱码之后打印的恰好就是arr2,对比上面,心细的同学发现了arr2后面没有说明数组元素的个数啊?这是因为C语言一维数组中允许定义的时候不写明有多少元素,系统会帮你进行一次计算。
        而对于arr3,我们则可以更贴切的理解什么叫做结束的标志,当系统打印完byte之后遇到\0也就停止下来,后面的try自然也就打印不出来了,而通过strlen的计算我们也可以确定,系统认为这个字符串到此就结束了,因此他的长度只有4(\0不会被strlen计算,但是会被sizeof计算)也有同学发现arr3定义了十个元素,但是很明显我们并没有输入十个元素,那么数组里面还包含了什么呢?让我们通过监视来看一下:

不完全初始化   

        可以看到数组后面的元素都变成了\0,实际上是ascll码0,这就是数组中的不完全初始化,在C语言中对于任何一种类型的数组,当不赋值完的时候,也就是剩下一些元素没有用到,系统都是默认初始化为0,对于int类型数组的大家可以体会的更加明显,不信可以去亲自体会一下哦~当然不完全初始化的前提是有初始化,假设int arr[10];那么此时完全没有初始化,那么此时数组中可不是0,具体是什么大家可以亲身体会一下,理解的更加透彻~

转义字符

        

对于转义字符有很多,其中 \ 是主要的转义字符标志,在此主要介绍以下几种

  \r   防止出现三字母词
      三字母词,在一些古老的编译器中,如vs6.0  ??)会被解析为],??(会被解析为[
 \" \'将"或'转变为字符的意思,否则系统默认会将其和前面的一个引号匹配,或作为一个新的开头
 \\   将\不再是转义字符的标志,而是一个字符\
 \a   蜂鸣警告,建议实际操作就知道是什么声音了
 \n   我们熟知的换行
 \t   水平制表符,相当于键盘上面的tab,打印多个空格
 \ddd ddd表示1-3个8进制数字,如\01表示0 * 8¹ + 1 * 8⁰ = 1
 \xdd dd表示两个16进制数字
    \ddd 和 \xdd都可以接多个数字,并不是必须达到3个或者2个,可少不可多

同时在scanf以及printf中遇到的%d,%f等也属于转义字符哦

下面给出一个易错的经典案例,同学们先猜一下结果是多少再看答案哦

#include<stdio.h>
#include<string.h>

int main()
{
	char arr[] = { "C:\tencent\x86\myfile\028.jpg”" };
	printf("%d", strlen(arr));
	return 0;
}

        正确答案是24,也许很多同学会的出来23的结果,但是“坑”就在这里!\028是两个字符,8是独立的一个字符,原因就在于在八进制中是没有8这个数字的,就像二进制没有2一样,所以同学们要记得注意哦~

最后悄咪咪告诉大家一个装13的方法,将你的QQ号变成16进制,并在最前面加上0x,也可以用来登陆自己的QQ哦~

记得三连哦~

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值