Hello~我是芝士,接着上一篇博客的内容,今天主要给大家介绍一些零碎的知识点,主要包括字符与ASCII码、C语言常见关键字、signed和unsigned。
目录
1.字符与ASCII码
上一篇文章中我们介绍了字符数据类型,也提到字符类型最容易理解的便是ASCII码中的各种字符,由此可见字符与ASCII码有着密切关系。更加简洁易懂的是,在键盘上可以敲出各种字符,比如a b c $ 等,都属于字符
。并且C语⾔中字符是⽤单引号
括起来的,如’a’ ‘b’ ‘c’ ‘$’。
在计算机中, 所有的数据都是以⼆进制的形式存储的,键盘上的可以直接打出的字符都有一个二进制编码即ASCII 编码
。C语⾔中的字符就遵循了 ASCII 编码的⽅式。为了便于理解,给出了C语言的128个ASCII各种进制的编码如下所示:
ASCII码表
下列码表含有全部 128 个 ASCII 十进制 (dec) 、八进制 (oct) 、十六进制 (hex) 及字符 (ch) 编码。
具体可参考链接:https://zh.cppreference.com/w/cpp/language/ascii
对于上面的ASCII码表,不需要记住所有的ASCII码表中的数字,使⽤时查看就可以,但是对于一些常见的可以进行一定的掌握。比如:
1.字符A~Z的ASCII码值从65~90;
2.字符a~z的ASCII码值从97~122;
3.对应的大小写字符(a和A)的ASCII码值的差值是32;
4.数字字符0~9的ASCII码值从48~57;
5.换⾏ \n 的ASCII值是:10;
6.在这些字符中ASCII码值从0~31 这32个字符是不可打印字符,⽆法打印在屏幕上观察。
既然ASCII码对应了字符,因此在我们可以用%c
来对这些单个字符指定格式:
#include <stdio.h>
int main()
{
printf("%c\n", 'a');
printf("%c\n", 97);//a对应的ASCII码是97
return 0;
}
最后得到输出
a
a
因此可以根据这一个规律打印一串的字符了,这里会用到一些进阶循环知识点,程序如下所示:
#include <stdio.h>
int main()
{
for (int i = 65; i < 90; i++)
{
printf("%c ", i);
}
return 0;
}
得到输出:
A B C D E F G H I J K L M N O P Q R S T U V W X Y
2.C语言常见关键字
C语⾔中有⼀批保留的名字的符号,比如定义各种数据类型的关键字:int return for 等,是C语言内置的一些符号,这些符号被称为保留字或者关键字
。
值得注意的是:
1.每个关键字都具有特殊意义,是保留给C语言使用的;
2.在创建标识符时不能与关键字重复;
3.关键字不可以自己创建。
C语言中有32个常用的关键字如下表所示:
其中标志橙红色的一些关键字我们也简单地了解过一些,对于这32个关键字的学习,可以随着知识点的而不断积累,如此便不需要死记硬背。
C语言的全部关键字可点击链接:https://zh.cppreference.com/w/c/keyword
对于以上关键字,这里简单介绍几个:
2.1 关键字 typedef
typedef
顾名思义是类型定义即类型重命名
。具体使用如下程序所示:
#include <stdio.h>
typedef int num;//将int 重命名为num,num成为了一个类型名
int main()
{
int num1 = 0;
num num2 = 12;
//num1 和 num2 两个变量类型相同
printf("%d\n", num1);
printf("%d\n", num2);
printf("%zd %zd", sizeof num1, sizeof num2);
return 0;
}
输出结果
0
12
4 4
因此,可以简单的理解typedef的主要作用就是将一些变量的类型名称进行重新的定义(换一个表示),注意typedef只能对类型进行重命名
。
2.2 关键字static
在我们上一篇文章讲到,变量根据其作用域可以分为局部变量和全局变量,在C语言中关键字static可以用来修饰变量,也可以修饰函数,可以概括为以下三点:
1.修饰局部变量——静态局部变量
2.修饰全局变量——静态全局变量
3.修饰函数——静态函数
2.2.1 static修饰局部变量
为了更好理解static修饰局部变量的作用以及意义,这里直接用两个程序进行对比展示:
程序1 没有使用static修饰局部变量a
//程序1
#include <stdio.h>
// 定义一个test函数
//void用于无参数或无返回值的函数,即没有return
void test()
{
int a = 1;
a++;
printf("%d ", a);
}
int main()
{
//for循环10次
for (int i = 0; i < 10; i++)
{
test();//调用了test函数
}
return 0;
}
输出结果
2 2 2 2 2 2 2 2 2 2
//输出了10个2,因为test函数中的a是局部变量,局部变量的生命周期是进入的时候创建,出去的时候销毁
程序2 使用static修饰局部变量a
#include<stdio.h>
void test()
{
static int a = 1;//使用了static修饰局部变量a
a++;
printf("%d ", a);
}
int main()
{
for (int i = 0; i < 10; i++)
{
test();
}
return 0;
}
输出结果
2 3 4 5 6 7 8 9 10 11
根据以上程序1和程序2的结果
对比分析可以得出以下结论:
static修饰局部变量的时候,局部变量出了作用域不销毁。
本质上是因为static修饰局部变量的时候改变了它的存储位置(局部变量原先存储在栈区,static修饰之后存储在静态区,使得其生命周期变长)!!!注意变量一旦创建,其存储的位置就确定了
2.2.1 static修饰全局变量
对于static修饰全局变量的作用,下面也用程序对比进行表示:
程序1 未使用static修饰全局变量a
我们在同一个project中再次建立一个.c
文件,并且创建一个全局变量a,如下图所示:
然后我们在另一个.c文件中调用这个全局变量
程序2 使用static修饰全局变量a
在add.c文件中
static int =128;
不改变另一个.c文件的程序进行运行报错
因此得到结论
static修饰全局变量的时候可以改变其链接属性由外部链接属性变成内部链接属性,存储位置不变,其他源文件(.c)文件就不能进行使用
(即被static修饰的全局变量a只能在add.c它本身在的这个文件中使用)简而言之,一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
2.2.1 static修饰函数
函数与全局变量非常类似,对于static修饰函数的作用,这里也用程序进行展示:
程序1 未使用static修饰函数
同理,我们新建一个.c文件写入一个函数
在另一个.c文件中进行调用得到以下结果
可以发现正常运行,并且得到了结果,因此可以判断函数与全局变量相似,都具有外部链接属性
。
程序2 使用static修饰函数
在add_test.c文件中加入static修饰函数
static int ADD(int x, int y)//使用static修饰
{
return x + y;
}
运行得到结果
因此得到结论:一个函数本来是具有外部链接属性,但是被static修饰时,外部链接属性变成了内部链接属性,其他源文件(.c)文件就无法使用了
简而言之,一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用
3.signed和unsigned
C 语⾔使⽤ signed 和 unsigned 关键字修饰字符型和整型类型
。(只能修饰这两者类型)
signed 关键字
,表示⼀个类型带有正负号(+ -)
,包含负值,比如我们生活中的温度有正负;
unsigned 关键字
,表示该类型不带有正负号
,只能表示零和正整数,如我们生活中的值身高、体重。
比如创建有符号整型变量n和无符号整型变量n
signed int n
:变量n可以存正数+负数
unsigned int n:
变量n只能存正数和0
对于 int 类型,默认是带有正负号的,也就是说 int 等同于 signed int
,由于这是默认情况,关键字 signed ⼀般都省略不写,但是写了也不算错。绝对不能理解成包含关系!
这里以整数变量的声明为例,unsigned有一个好处,即同样长度的内存能够表示的最大整数值增加一倍(这里我可以理解为原来signed修饰的整型变量包括正数+负数,被unsigned修饰之后内存不变的情况下相当于将signed的负数数量值加长到unsiged中了,这样也就保证了变量内存大小)
比如
16位的signed short int 取值范围是:-32768~32767
16位的unsigned short int 取值范围是:0~65535
字符类型 char 也可以设置 signed 和 unsigned
signed char c——范围为 -128 ~ 127
unsigned char c——范围是0~225
但是C 语⾔规定 char 类型默认是否带有正负号,由当前系统决定。
即char 不等同于 signed char ,它有可能是 signed char ,也有可能是unsigned char。
好啦,以上就是本篇想要分享的知识点,如有书写不当,欢迎大家批评指正!ps时隔一个月终于写下了我的一篇博客,最近需要抓紧生产啦,巩固学习过的知识点,加油加油加油 :)