C语言笔记第01章:初识C语言(二)

简介: C语言笔记第01章:初识C语言

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 🚩 变量的命名规则

  1. 命名应当直观且可以拼读,可望文知意,便于记忆和阅读。最好采用英文单词或其组合,不允许使用拼音。程序中的英文单词一般不要太复杂,用词应当准确。
  2. 命名的长度应当符合用最少单词表达出最详细的信息原则。C 是一种简洁的语言, 命名也应该是简洁的。例如变量名MaxVal 就比MaxValueUntilOverflow 好用。标识符的长度一般不要过长。
  3. 另外,英文词尽量不缩写,特别是非常用专业名词,如果有缩写,在同一系统中对同一单词必须使用相同的表示法,并且注明其意思。
  4. 当标识符由多个词组成时,每个词的第一个字母大写,其余全部小写。比如StudentAgeStudentFatherName
  5. 尽量避免名字中出现数字编号,如Value1,Value2 等,除非逻辑上的确需要编号。
  6. 初学者总是喜欢用带数字的变量名或函数名,这样子看上去很简单方便,但其实是一颗颗定时炸弹。这个习惯初学者一定要改过来。

这里说的是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资源分享,请勿外传。

相关文章
|
8月前
|
存储 人工智能 算法
【C语言】自学终极笔记
【C语言】自学终极笔记
111 0
|
5月前
|
测试技术 C语言 C++
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
|
5月前
|
存储 C语言
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
|
7月前
|
C语言
|
7月前
|
C语言
|
8月前
|
C语言
C语言(指针详解)重点笔记:指针易错点,都是精华
C语言(指针详解)重点笔记:指针易错点,都是精华
93 0
|
存储 编译器 C语言
C语言笔记第03章:数组(四)
C语言笔记第03章:数组
109 0
|
编译器 C语言 索引
C语言笔记第03章:数组(一)
C语言笔记第03章:数组
111 0
|
8月前
|
NoSQL Redis C语言
|
C语言
C语言初阶 牛客网刷题笔记(将持续更新..)
C语言初阶 牛客网刷题笔记(将持续更新..)
C语言初阶 牛客网刷题笔记(将持续更新..)