C语言基础(一)

141 阅读6分钟

引言

本篇文章主要介绍常量与变量、字符串、转义字符三个方面内容,知识较为基础,不会深入讲解,适合初学者

一.常量与变量

在生活中,有些值是不变的,如一个人的姓名,性别,圆周率等 有些值是可变的,如一个人的身高,年龄,体重等。

在C语言中,我们把不变的值用常量表示,变化的值用变量表示。

1.1定义变量的方法

int age = 150;
float weight = 45.5f;
char ch = 'w';

1.2变量的命名

  1. 只能由字母(包括大写和小写)、数字和下划线( _ )组成。
  2. 不能以数字开头。
  3. 长度不能超过63个字符。
  4. 变量名中区分大小写的。
  5. 变量名不能使用关键字。

1.3变量的分类

  • 局部变量
  • 全局变量 通俗来说,定义在某个大括号内部的就是局部变量,在大括号外部定义的就是全局变量 下面看看这段代码
#include <stdio.h>
int global = 2019;//全局变量
int main()
{
    int local = 2018;//局部变量
    //下面定义的global会不会有问题?
    int global = 2020;//局部变量
    printf("global = %d\n", global);
    return 0;
}

实际上global变量的定义并没有问题,代码能运行,结果是2022 总结当局部变量和全局变量同名的时候,局部变量优先使用。

1.4变量的作用域和生命周期

  • 作用域:一段程序代码中所用到的名字并不总是有效/可用 的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
  1. 局部变量的作用域:变量所在的局部范围。
  2. 全局变量的作用域:整个工程。 如何理解全局变量的作用域是整个工程? 在这里插入图片描述

我在同一个工程中建立了add.c和test.c两个源文件,将g_val这个全局变量定义在add.c中,但是当我在test.c中使用这个变量时编译器却会报错:"g_val:未声明的标识符" g_val不是一个全局变量吗?不是整个程序中都可以用吗?为什么会报错呢?

其实这个问题很好解决,只需用到一个extern关键字

extern是外部的意思,用extern声明g_val这个外部符号,告诉编译器这个编译器在外部,到外面去找它。

//声明外部符号
extern int g_val;

int main()
{
	printf("%d\n", g_val);

	return 0;
}
  • 生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
  1. 局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束。
  2. 全局变量的生命周期:整个程序的生命周期。

3.5常量

常量分为以下四种:

  • 字面常量 比如 100 是整型字面值 ‘w’ 是字符字面值 3.14 是浮点型的字面值 "abcdef" 是字符串常量

  • const 修饰的常变量 用const关键字修饰变量后,变量具有了常属性,值不能被修改,但它本质上还是一个变量。修饰的变量在C语言中只是在语法层面限制了变量不能直接被改变,但它本质上还是一个变量的,所以称它为常变量

  • #define 定义的标识符常量

#include <stdio.h>
int main()
{
#define MAX 100
    printf("max = %d\n", MAX);
    return 0;
}

打印结果是100。在程序编译之前,也就是预处理这一步时,代码中的MAX这个符号就被替换成了100。

  • 枚举常量 这里不做介绍,后续的学习会详细讲解

二.字符串

"hello,world"

这种由双引号引起来的一串字符称为字符串字面值,或者简称字符 字符串的结束标志是一个 \0 的转义字符(不用自己写,会默认加在字符串末尾)。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。

'\0'对于字符串来说非常重要

#include <stdio.h>
//下面代码,打印结果是什么?为什么?
int main()
{
    char arr1[] = "bit";
    char arr2[] = {'b', 'i', 't'};
    char arr3[] = {'b', 'i', 't''\0'};
    printf("%s\n", arr1);
    printf("%s\n", arr2);
    printf("%s\n", arr3);
    return 0;
}

第一个和最后一个结果都是bit 第二个输出一堆乱码,”烫烫烫“ 这是因为第一个字符数组使用一个字符串来初始化的,系统会自动在末尾添加‘\0’,打印时从字符串首开始,依次向后打印,直到遇见‘\0’停止打印; 而第二个使用三个字符来初始化数组的,末尾不会自动添加'\0',所以计算机会一直往后找,直到找到’\0‘; 第三个手动在末尾添加’\0’,所以也没问题

三.转义字符

假如我们要在屏幕上打印一个目录: c:\code\test.c 应该如何实现代码?

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

而实际运行结果是这样的: 在这里插入图片描述 其实这和转义字符有关。 转义字符,顾名思义就是转变的意思,下面看一些常见的转义字符

转义字符释义
\?在书写连续多个问号时使用,防止他们被解析成三字母词
'用于表示字符常量'
\“用于表示一个字符串内部的双引号
\\用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a警告字符,蜂鸣
\b退格符
\f进纸符
\n换行
\r回车
\t水平制表符
\v垂直制表符
\dddddd表示1~3个八进制的数字。 如: \130
\xdddd表示1~2个十六进制数字。 如: \X30

下面来详细介绍其中的几个

    1. '\?', 在书写连续多个问号时使用,防止他们被解析成三字母词 例如我想打印(Are you ok??)必须写成
printf("(Are you ok\?\?)");

因为??)是一个三字母词,对应],必需在‘?’前使用斜杠使它转义

  • 2. '\\'表示一个反斜杠,常用于书写文件路径
printf("c:\\net\\nest.c");
    1. '\ddd',其中ddd表示1~3个八进制的数字 如'\130',130一个八进制数字,转换为十进制就是88,‘\130’表示的就是88这个ASCII码值对应的字符,也即字符‘X’ \Xdd的用法和这个类似

以上就是本次的全部内容了,有不对的地方欢迎大家批评指正。