5.4.2 const 修饰的常变量
#include<stdio.h> int main() { const int num = 10; printf("%d\n", num); num = 20; printf("%d\n", num); return 0; }
const — 常属性。num:const修饰的常变量,本质上,num还是一个变量。
可以看到,我们刚才写的代码是编译不通过的,可我们刚才又提到了 num 本质是变量,变量不是可以修改吗?这是咋了
📍 其实,这个错误是在程序编译
的时候给出的,注意这里,这个时候并没有生成可执行文件,说明const修饰的变量可否修改是由编译器来帮我们保护了,编译器认为你既然声明了const
,那就不能给 const修饰的变量a 赋值。
📍 但是,我们可以在可执行程序执行的时候对 const修饰的常变量a 进行修改,既然能修改,那 a 依旧还是个变量,因此 常变量本质还是变量 这句话是没错的,我们可以在 可执行程序执行的时候对常变量的值进行修改。
补充:
关于可执行程序执行时候与如何在此期间对常变量进行修改,等我们讲到指针再来细品。
这时候,你可能就有疑惑了,既然const修饰的常变量是可以修改的,那为什么我们有时候还是需要定义呢,干嘛不直接定义为普通变量呢,这样修改起来也多方便呀。
其实,const修饰的变量,其实质是告诉程序员或编译器该变量为只读,如果程序员在程序中显示的修改一个只读变量,编译器会毫不留情的给出一个error。因此程序员如果定义了一个 const修饰的变量,就是在告诉自己,或者其它阅读与继续编写你的代码的程序员,不要打主意去用指针修改我定义的这个const常变量,其它程序员看到你写的const常变量就会明白:“哦,这个常变量是有用的,我不要去改它,写这个const来修饰变量的程序员在告诉我不要去动它的值!”
5.4.3 #define 定义的标识符常量
#include<stdio.h> #define MAX 100 //设置 常量MAX 的值为 100 int main() { //将常量MAX的值赋值给 num int num = MAX; printf("%d\n", num); return 0; }
5.4.4 枚举常量
生活中有一些事物是可以列举的:星期、颜色、性别、月份等等。
枚举常量关键字:enum
#include<stdio.h> enum week //星期 { Mon, Tues, Wed, Thur, Fri, Sat, Sun }; enum girl{ Baby, Judy, Weddy } int main() { enum week day = Mon; //从 枚举类型 girl 中挑选出 Weddy enum girl myGril = Weddy; return 0; }
5.5 🚩 变量的命名规则
- 命名应当直观且可以拼读,可望文知意,便于记忆和阅读。最好采用英文单词或其组合,不允许使用拼音。程序中的英文单词一般不要太复杂,用词应当准确。
- 命名的长度应当符合
用最少单词表达出最详细的信息
原则。C 是一种简洁的语言, 命名也应该是简洁的。例如变量名MaxVal 就比MaxValueUntilOverflow 好用。标识符的长度一般不要过长。 - 另外,英文词尽量不缩写,特别是非常用专业名词,如果有缩写,在同一系统中对同一单词必须使用相同的表示法,并且注明其意思。
- 当标识符由多个词组成时,每个词的第一个字母大写,其余全部小写。比如
StudentAge
、StudentFatherName
- 尽量避免名字中出现数字编号,如Value1,Value2 等,除非逻辑上的确需要编号。
- 初学者总是喜欢用带数字的变量名或函数名,这样子看上去很简单方便,但其实是一颗颗定时炸弹。这个习惯初学者一定要改过来。
这里说的是C语言的命名规范,但在其他语言比如Java语言中又会有所不同,这里提一嘴,希望注意。
6.字符串、转义字符、注释
6.1 字符串
"hello world" "你好,软件协会" "" //这是一个空字符串
这种由双引号(double quote — ""
)引起来的一串字符称为字符串字面值
(String Literal),简称字符串。
字符串的结束标志是一个\0
的转义字符。在计算字符串长度(strlen
)时, \0 是结束标志,不是字符串内容。。\0 对字符串来说,很重要。
这里呢也是稍微提一嘴,关于字符串我们放在数组细品。
📝 还是上个代码,留个印象
#include<stdio.h> #include<string.h> int main() { char arr1[] = "jing"; printf("arr1 = %s\n", arr1); printf("\n"); printf("arr1_length = %d\n", strlen(arr1)); return 0; } //strlen函数:计算字符串长度,遇到'\0'停止。
6.2 转义字符
📝 先上个例子引出转义字符(说明:\n代表换行符,即在输出时遇到了 \n 则会自动换行输出)
#include<stdio.h> int main() { printf("\now I love you"); return 0; }
【什么是转义字符】
转义字符(Escape character),所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加""来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。简单来说就是在一些字符前加 “\” 使它具有其他意义。
【常见的转义字符】
【水平制表符 \t 演示】
#include<stdio.h> int main() { printf("\tnow I love you"); return 0; }
【面试题】
💬 请说出下列代码的输入结果。
#include<stdio.h> #include<string.h> int main() { printf("%d\n",strlen("C:\test\32\code\test.c")); return 0; }
转义字符虽然包含两个或多个字符,但它只代表一个字符。编译系统在见到字符“\”时,会接着找它后面的字符,把它处理成一个字符,在内存中只占一个字节。
结果解释:
- 红色字符:一个字符算一个,13个。
- 紫色字符:
\
与其后面的(紫色)字符合起来算一个字符,4个。 - 单独的一个
\
不计算长度。
\32
解释:
- 32是2个8进制数字。
- 8进制的32转换成十进制数字为26。
- 26作为ASCII码值,找到对应的字符 — Z。
6.3 注释
6.3.1 分类
1️⃣ 单行注释
#include<stdio.h> int main() { //这是一个单行注释 return 0; }
2️⃣ 单行注释
#include<stdio.h> int main() { /* 这是一个多行注释 诶,你看,我可以写多行诶 */ return 0; }
多行注释即在/* */
内的内容都是注释
6.3.2 为什么要有注释
- 代码中有不需要的代码可以直接删除,也可以注释掉。
- 代码中有些代码比较难懂,加注释,便于理解。
- 学会写注释,多写注释都是一个合格程序员的体现。
- 注释也是为了代码的后续维护,实际工作中你写了一个程序并运行了这个项目,这时候需要对程序进行更新或遇到bug需要修改代码,不写注释你可能都不知道自己写的代码是干嘛的,更别说别人来维护你的代码了,估计你家祖宗都会被其它程序员依次问候一遍。
6.3.3 注意事项
注释不能嵌套使用
#include<stdio.h> int main() { /* 我的外层注释 /*我的内层注释 */ */ return 0; }
上述代码是错误,这是为什么呢?
你想一个 /*
对应一个 */
,那我们从第一个 /*
开始看,往后走,遇到的第一个 */
只不是就是紧跟在我的内存注释
后面的那个*/
。因此在这里会直接进行匹配,至于最后一个 */
该何去何从呢?编译器给你报错呗!
7.常见关键字
💬 看看就行,这些会在以后逐个讲到
//类型名 short int long char float double void //选择、循坏 if else for switch break continue case default do while goto return //自定义类型 struct union typedef enum //修饰 const static extern auto signed unsigned //其他 volatile sizeof register
8.格式控制符
9.简单的输入输出
💬 C语言的输入输出其实很庞大,因为初学,我们先做简单了解,之后单独搞一个专门篇章(由入门到进阶)讲解。
9.1 printf
话不多说,上代码进行用法说明:
#include<stdio.h> int main() { printf("软件协会欢迎你\n"); // \n是换行符,你可以试试不加换行的效果 int a = 10; /* %d 是int类型的占位符 逗号“,”后面的变量或变量就会去代替占位符,输出该变量的值 */ printf("%d\n", a); int b = 89; printf("%d 有 %d ,%d 不离 %d\n", a, b, b, a);//这个结果你能想到吗 //刚才提到了也可以用常量,%lf 是double类型的占位符 printf("%lf", 13.14); return 0; }
运行结果:
9.2 scanf
这里也是先了解简单使用,目前使用你按下述模板来就行:
#include<stdio.h> int main() { //变量未定义值 int score; printf("请给这篇文章打分(整数):"); /* 这个 %d 是占位符,在逗号“,”后面的是 &变量名 表示通过键盘给这个变量赋一个值 */ scanf("%d", &score); //我们输出,验证一下是不是我们通过键盘输入的值 printf("您给的分值是:%d", score); return 0; }
这个代码放在 dev
等编译器中是生效的,但在 VS
当中会报错,给出不安全警告,这是为什么呢?
📍 由于微软工作人员从函数安全性
的考虑,在VS中弃用了scanf函数,之后创建了scanf_s函数来代替使用,所以在VS中,大多数时候我们还是使用scanf_s函数
所以我们只需在 VS 中对上述代码进行小小修改:scanf
统一改为 scanf_s
#include<stdio.h> int main() { //变量未定义值 int score; printf("请给这篇文章打分(整数):"); /* 这个 %d 是占位符,在逗号“,”后面的是 &变量名 表示通过键盘给这个变量赋一个值 */ scanf_s("%d", &score); //我们输出,验证一下是不是我们通过键盘输入的值 printf("您给的分值是:%d", score); return 0; }
其实不是说不可以使用scanf函数,只不过是预处理器会发出错误警告并停止编译,如果想要坚持使用scanf函数的话,可以在头文件定义#define _CRT_SECURE_NO_WARNINGS
我们把上面的代码修改一下,依旧在 vs 中采用 scanf,上代码演示:
#define _CRT_SECURE_NO_WARNINGS //放在首行,在#include<stdio.h>之前 #include<stdio.h> int main() { //变量未定义值 int score; printf("请给这篇文章打分(整数):"); /* 这个 %d 是占位符,在逗号“,”后面的是 &变量名 表示通过键盘给这个变量赋一个值 */ scanf("%d", &score); //我们输出,验证一下是不是我们通过键盘输入的值 printf("您给的分值是:%d", score); return 0; }
10.小结
💬 本章我们初步了解了C语言以及基本的使用,遇到任何疑惑联系软件协会
🏠 了解更多关注软协官网:https://www.csuftsap.cn/
💚 来自软件协会的编辑,注册会员可在官网下载所有开源.md
资源分享,请勿外传。