目录

常量

字面常量

常变量

标识符常量

枚举常量

数组

字符串数组

字符串结束标志\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 + 1int 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哦~

记得三连哦~

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

  1. 【濡白的C语言】从零开始的刷题之旅

    前言 每个人都是从小白成长起来的,在此篇记录一些我从小白开始刷到的一些有意义的题目,不定期更新题目,建议点赞+收藏后享用~感谢支持!,也欢迎评论出想看的题目类型,会考虑添加的! 题目的话我会给出题干, ...

  2. c语言中数组名可以与其他变量名相同,C语言初学者入门讲座 第九讲 数组(1)...

    C语言初学者入门讲座 第九讲 数组(1) (2007-01-17 11:39:19) 数组在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来.这些按序排列的同类数据元素的集合称为 ...

  3. 【濡白的C语言】初学者-从零开始-5(模块化设计——函数,传值和传址)

    前言 C语言编程又称模块化设计,讲的就是对于一个程序而言,每一个功能都要类似于独立的实现,就像一个个板块,需要的时候拿出来即可.模块化的设计思想是一个程序员必不可缺少的思想. 如果有不明白的地方,或者 ...

  4. 【濡白的C语言】初学者需要注意的坑,亲身经验

    前言 大部分学习计算机的人首先接触的一门语言都是C语言,但是经常会发现对于同样的课程,学习完之后不同的人能力却有着天壤之别 !而差别出现的原因大部分是学习过程的方法不好,于是精心整理一下了自己学习C语 ...

  5. c语言中通过键盘给一维数组赋值怎么_编程C语言进阶篇——构造类型:数组

    在c语言的实际应用中,我们常常需要同时对多个数据进行处理,如果没有专门批量处理数据的方法,就会给我们的程序编写造成巨大的影响.而这种批量处理数据的方法就是我们这次的主题--数组. 一.数组是什么 在c ...

  6. C语言入门(八)一维数组

    概念 数组是相同数据类型的有序数据的集合. 数据类型可以是基本数据类型们也可以是指针.结构体和共用体等类型. 有序并不是按一定的顺序升序或降序,而是这些数据都有一个下标,带有一个下标的就称为一维数组, ...

  7. C++语言篇 第五章 一维数组

    一.一维数组的定义 数组就是一组相同类型的变量,它们往往都是为了表示同一批对象的统一属性,如一个班级所有同学的身高.全球所有国家的人口数等. 数组可以是一维的,也可以是二维或多维的.  数组: 是一组 ...

  8. 【C语言学习笔记】: 一维数组

    C语言一维数组的定义 一般形式 类型符 数组名[常量表达式] C语言使用一维数组注意事项 数组名的命名规则和变量名相同,遵循标识符命名规则. 在定义数组时,需要指定数组中元素的个数,方括号中的常量表达 ...

  9. c语言随机生成整数存放一维数组_文科生学 Python 系列 7: Numpy 数组/索引和切片...

    第四课:本课内容: • 0. 导入 NumPy 包 • 1. 创建 NumPy 数组 • 2. 索引和切片 • 3. 读取文件 • 4. 布尔型索引 • 5. 数组的运算 • 6. 常用函数举例 Nu ...

最新文章

  1. Asp.net 2.0 C#实现压缩/解压功能
  2. usb协议规范_你想了解的USB知识,都在这里了!
  3. python必背内容-【经验分享】学Python必背的初级单词
  4. V-rep学习笔记:机器人逆运动学解算
  5. SAP - 银企直联
  6. Android studio导入另外一个项目作为Library后出现两个启动项目等各类问题
  7. c语言课程设计平时成绩,计算中心
  8. 为什么高斯分布概率密度函数的积分等于1
  9. QT_Astyle 代码管理工具
  10. 上传项目到GitLab
  11. Android 的singleTask和singleInstance的一点思考
  12. 完美解决 WinRAR 中文版 启动时的超恶心广告弹窗
  13. 微信小程序:全新圣诞节头像框制作生成微信小程序源码下载支持多模板
  14. 微信公众号一次性订阅消息功能开发实践
  15. 世界品牌新500强揭晓 中国移动央视海尔入前百名
  16. [转]这些道理不懂,你注定就是穷打工的命
  17. 11个销售心理学方法,帮你搞定客户!
  18. java合并单元格边框不完整,java poi 合并单元格后边框问题
  19. web前端项目实战_vue项目仿美团【爱创课堂】
  20. 数据模拟:利用Java模拟数据(姓名,邮箱,地址,电话等信息,时间,工资,1-10随机数)并存入mysql

热门文章

  1. 【Java实战】微信Native扫码支付(主扫)开发详解
  2. hive如何全角转半角?
  3. 作为一名职场新人,入职四博公司十周年的感想
  4. Android FFmpeg 音视频开发教程
  5. alin的学习之路(数据库篇:五)(MySQL的相关语句及API的C语言实现)
  6. 不出所料,联通iphone软件屏蔽wifi
  7. 转载 - 5个在线的网站测试和验证工具
  8. x趋于0时,xlnx和x^x的极限
  9. SQL ZOO我的答案2之SELECT from World
  10. Invertible matrix