C语言中基础知识总结(一)

                                                                       文章目录

一、变量是什么?

二、变量的命名规则

三、常量是什么?

四、字符串和字符的区别

五、常见的关键字罗列

六、数据类型及格式化输出占位符

七、ASCII码的记忆技巧

八、字符串长度的计算(易错细节)


一、变量是什么?

        首先,变量是计算机程序中用于存储和操作数据的一种命名标识符(也可被称为用户自定义标识符)。它可以被看作是一个内存中的存储空间,用于存储不同类型的数据,如数字、文本、布尔值等。

        每个变量都有一个唯一的名称(标识符),通过这个名称可以在程序中引用和操作变量的值。在使用变量之前,需要先声明它们的类型,以便计算机能够为其分配适当的内存空间。

        

 

变量声明

        以下是变量声明的语法:

int main(){
    int num;
}

        代码例子:

        以下是创建了一个num变量,并且将变量初始化值为3,并用printf进行打印

# include <stdio.h>
int main()
{
    int num=3;
    printf("%d",num);
    return 0;
}

二、变量的命名规则

        命名规则如下:

          (1)标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线(_)组成的字符串,并且其第一个字符必须是字母或下划线。

         (2)标识符命名绝对不能和关键字和库函数一致!!!重要的事三个感叹号警告!!!

三、常量是什么?

        简单来说,常量就是不可改变的量,常量是程序中一个固定的数值的标识符,它们在程序运行期间保持不变。与变量不同的是,常量的值在定义之后不能被改变。

        常量可以是数字、字符、字符串或者其他数据类型的值。它们通常用于表示在程序中用到的固定值,如数学常数、设定值或者其他不变的数据。  

        在C语言中,常量分为以下几种类型:

  1. 整数常量:表示整数值,例如 123、-5、0。

  2. 浮点数常量:表示带有小数部分的数值,例如 3.14、-0.5。

  3. 字符常量:表示单个字符,用单引号括起来,例如 'A’、’1’。

  4. 字符串常量:表示一串字符组成的数组,用双引号括起来,例如 "Hello, World!"。

  5. 符号常量:使用 #define 预处理指令来定义的常量,通常用全大写字母命名,例如 #define PI 3.14159。

        常量在程序中用于提供不变的数据值,可以在不同的地方多次使用。常量的使用可以增加代码的可读性和可维护性,避免了在代码中多次写入相同的不变值。

        需要注意的是,常量在定义之后不能被修改,试图修改常量的值会导致编译错误。常量通常用于表示固定的数值或数据,而变量则用于存储和操作可变的数据。

       

         以下是不同类型的常量定义的示例:

1.整数常量

int num = 10;
const int MONTHS = 12;

        这里我们是做了一个对比,int num是声明了一个正常的变量并初始化,而下面的const关键字我们在稍后会讲,不用担心看不懂,现在只需要知道 在声明正常变量前加个const关键字就变成了不可修改的常量。

2.浮点数常量

float pi = 3.14;
const double gravity = 9.8;

3.字符常量

char ch = 'A';
const char ESCAPE = 'B';

        我们创建了一个ch变量值为A,又同样在下面声明了一个常量进行对比

4.字符串常量

char greeting[] = "Hello,World!";
const char * message = "Welcome to the program.";

        在C语言中存储字符串的方式为数组,所以我们在这里创建了一个数组做个示例,至于数组是什么在后续的文章中会细讲,这里做个例子供大家学习。

5.符号常量(使用 #define 预处理指令):

#define PI 3.14159
#define MAX_SIZE 100

需要注意的是,使用 const 关键字可以将变量声明为常量,这样一旦被赋值后就不能再修改。而使用 #define 定义的符号常量在预处理阶段会进行文本替换,不会分配内存空间。

也就是说 在预处理阶段PI(标识符)直接代替了3.14159这个数字。

define和数组在之后会细讲,在这里只是罗列举例,先讲基础!

四、字符串和字符的区别

        编程语言基础知识大同小异,字符串和字符在编程语言中是比较严谨的,对两者的概念不能混淆,首先:

字符:用来表示字符字面量, 'a'表示字符字面量,在内存中占1个字节,'a'+1表示'a'的ASCII码加1,结果为'b'(表示单个字符或者单个整数)

                        

字符串:用来表示字符串字面量,"a"表示字符串字面量,在内存中占2个字节,"a"+1表示指针运算,结果指向"a"结束符'\0'

重点:

1、字符字面量在执行时会被编译成对应的ASCII码,也就是说我们在使用的时候,字符的ASCII码会被访问。

 

2、字符串字面量会被编译成对应的内存地址,因为字符串是一长串数据,自然不可能和字符的处理方式一样,在使用的时候,字符串的地址会被访问。

 

3、printf的第一个参数会被当成字符串内存地址 

 

4、内存的低地址空间不能在程序中随意访问

       

        以下是一个示例图,首先,在C语言中0x08048000这个内存地址是非常特别的内存地址,所有低于这个地址的内存空间是不能访问的,一旦访问,就会出现错误。字符串在编译之后得到的地址都是大于0x08048000,所以在程序中可以被访问。

 

        大家可能会疑问,为什么'1'低于0x08048000为什么可以访问?结合上面我们所说的知识,单个字符的访问方式是ASCII码!!!而字符串的访问方式是地址!!!

在此罗列一下小白经常容易出现的问题:

(问题一)单引号双引号混淆

        大家一定要清楚一点,C语言的字符串存储方式是数组!!!,不存在"a"这种东西!如果想表示单个字符直接'a'即可

        错误如下:

#include <stdio.h>
int main() {
	char a = "a";
	return 0;
	printf("%s", a);
}

   

(问题二)\n为什么当变量可以,却不能直接用printf打印'\n'?

        还是结合我们上面所说,printf的第一个参数会被当成字符串内存地址!!!,不可以是字符!!!

        正确的方式如下:

#include <stdio.h>
int main() {
	char a = '\n';
	printf("打印成功:%c", a);
	return 0;
}

        或者也可以直接打印:

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

五、关键字罗列

        以下是C语言中的32个关键字:

autodoubleintstruct
breakelselongswitch
caseenumregistertypedef
charexternreturnunion
constfloatshortunsigned
continueforsignedvoid
defaultgotosizeofvolatile
doifstaticwhile

以下是关键字的大致解释:

auto: 用于声明存储类别的声明,声明自动变量 。

 

break: 用于退出条件,常见于循环中。

 

case: switch结构,case 用于在 switch 语句中进行条件匹配。

 

char: 声明数据类型为字符型。

 

const: 常用于声明常量  。

 

continue: 在循环中用于跳出”本次循环“。

 

default: 通常用于 switch 语句中的默认情况。switch 语句根据一个表达式的值来选择执行的分支,当表达式的值与任何一个 case 的值都不匹配时,就会执行 default 分支。

 

do: 用于定义一个 do-while 循环结构,do-while 循环会先执行循环体内的代码,然后再判断循环条件是否成立。

 

double: 声明数据类型为浮点型。

 

else: if判断语句中的”否则“语句,如果执行不成功,"否则" 怎么样。

 

enum: 用于定义枚举类型,枚举类型是一种用户自定义的数据类型,用于定义一组具有离散取值的常量。

 

extern: 用于声明一个全局变量或函数,表示该变量或函数是在其他文件中定义的。

 

float: 和double一样都是声明数据类型为浮点型,不一样的地方是double的精度更大,为双精度浮点型,而float为单精度。

 

for: 关键字用于for循环语句中。

 

goto: 用于控制程序的跳转。goto 语句可以将程序的执行直接跳转到程序中的指定位置。

 

if: 用于if判断语句中。

 

int: 声明数据类型为整形。

 

long: 用于声明一个长整型变量。long 变量通常用于存储比 int 类型更大范围的整数值。

 

register: 用于向编译器建议将变量存储在寄存器中,以便提高程序的执行速度。

 

return: 用于从函数中返回一个值或者终止函数的执行。

 

short: 用于声明一个短整型变量。short 类型通常用于存储比 int 类型更小范围的整数值。

 

signed: 用于声明有符号类型的整数变量。当使用 signed 关键字声明整数变量时,该变量可以表示正数、负数和零。

 

sizeof: 用于获取数据类型或变量在内存中所占用的字节数。

 

static: 用于声明静态变量。

 

typedef: 用于为已有的数据类型定义一个新的别名。通过 typedef 关键字,我们可以为某个数据类型创建一个新的名称,以方便在程序中使用。

 

union: 用于定义一个联合体(union)类型。

 

unsigned: 用于声明无符号整型变量。unsigned 变量只能存储非负整数,范围从 0 到类型的最大值。

 

void: 用于表示无类型(即不返回任何值)或空类型。

 

volatile: 用于声明一个变量为“易变的”(volatile variable),volatile 关键字的作用是告诉编译器,该变量的值可能会在程序的其他地方被意外地修改,因此编译器在优化代码时不应该对该变量进行优化。

 

while: 用于while循环中。

六、数据类型及格式化输出占位符

C语言的基本数据类型为:整型、字符型、实数型。这些类型按其在计算机中的存储方式可被分为两个系列,即整数(integer)类型和浮点数(floating-point)类型。
这三种类型之下分别是:short、int、long、char、float、double这六个关键字再加上两个符号说明符signed和unsigned就基本表示了C语言的最常用的数据类型。

下面列出了常见编译器下的数据类型大小及表示的数据范围:

类型名称类型关键字占字节数其他叫法表示的数据范围
字符型char1signed char-128 ~ 127
无符号字符型unsigned char1none0 ~ 255
整型int4signed int-2,147,483,648 ~ 2,147,483,647
无符号整型unsigned int4unsigned0 ~ 4,294,967,295
短整型short2short int-32,768 ~ 32,767
无符号短整型unsigned short2unsigned short int0 ~ 65,535
长整型long4long int-2,147,483,648 ~ 2,147,483,647
无符号长整型unsigned long4unsigned long0 ~ 4,294,967,295
单精度浮点数float4none3.4E +/- 38 (7 digits)
双精度浮点数double8none1.7E +/- 308 (15 digits)
长双精度浮点数long double10none1.2E +/- 4932 (19 digits)
长整型long long8__int64-9223372036854775808~9223372036854775808

  C99中新添加:布尔类型

想使用需要进行包含头文件<stdbool.h>

C 语⾔原来并没有为布尔值单独设置⼀个类型,⽽是使⽤整数 0 表⽰假,⾮零值表⽰真。

在 C99 中也引⼊了 布尔类型 ,是专⻔表⽰真假的。

布尔类型为两个值:true和false。

使用如下:

# include<stdbool.h>
# include<stdio.h>
int main()
{
	_Bool PD = true;
	if (PD) {
		printf("666");
	}
}

打印占位符:

char和unsingned char         %c
short                       %hd
unsigned short              %hu
long                        %ld
unsigned long               %lu
int                         %d
unsigned int                %u
float (float只能提供8位有效数字)                      %f/%g
double  (double能提供16位有效数字)                    %lf/%lg
%f和%lf会保留小数点后面多余的0 如 3.1400000 %.2f得 3.14
%g和%lg不会保留 如 3.14
size_t 打印                  %zd
strlen 打印                     %zu
    
标准的输入输出类型:(正负可参考数轴,左负右正)
%d(整形输入输出十进制数)
%3d(输入输出占三格靠右)
%-3d(输入输出占三格靠左
%c(输入输出字符)
%s(输入输出字符串 只需要首元素地址)
%e(输入输出指数形式)
%o(输入输出八进制)
%x(输入输出十六进制)
%u(输入输出无符号形式)
%f(输入输出浮点型(float))
%lf(输入 double 类型用,默认保留6位小数,否则会出错为0)
%lg (lg会把小数后面多余的0去掉)
%hd (输出端整形)
%p (输出地址格式)
%10.5(f 输出占 10 格 小数点也算一位 保留小数点后五位精度 四
舍五入靠右)
%-10.5f(输出占 10 格 小数点也算一位 保留小数点后五位精度
%%(输出一个%)
%#o(带前导的八进制)
%#x(带前导的十六进制)

 

七、ASCII码的记忆技巧

记差值和每种数据的开头第一个ASCII码

# 三个范围
A的ASCII码为65 (A-Z)
a的ASCII码为97 (a-z) // 大小写间的差值为32
0的ASCII码为48 (0-9)
# 三个范围依次往后推

# 不常用的
                     二进制            十六进制        十进制
CR回车键    0000,1101           0D             13
LF软回车键(用于word文档)
                     0000,1010           0A             10
ESC退出键   0001,1011           1B             27
SP空格键    0010,0000           20             32

八、字符串长度的计算(易错细节)

sizeof和strlen的区别

sizeof 和 strlen 是两个不同的函数,它们在计算字符串的长度或大小时有一些不同之处。

  1. sizeof 运算符用于计算变量或数据类型的大小。对于字符串而言,使用 sizeof 运算符可以得到包括 null 字符在内的整个字符数组的大小,而不仅仅是字符串的长度。

  2. strlen 函数用于计算字符串的长度,即字符串中字符的个数,不包括 null 字符。strlen 函数会从字符串的起始位置开始遍历,直到遇到 null 字符为止。

以下是一个示例,演示了sizeof 和 strlen 的不同之处:

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello";
    
    int size = sizeof(str);
    int length = strlen(str);
    
    printf("Size of str: %d\n", size); // 输出: Size of str: 6
    printf("Length of str: %d\n", length); // 输出: Length of str: 5
    
    return 0;
}

在上述代码中,字符串 “Hello” 的大小(包括 null 字符)是 6,而字符串的长度是 5。

总结来说,sizeof 运算符用于计算变量或数据类型的大小,对于字符串而言会包括 null 字符;而 strlen 函数用于计算字符串的长度,不包括 null 字符。在使用时需要根据具体需求选择使用。

小结:

        要细节,一些小问题就会直接导致代码的无法执行或报错!!!别的内容,下次一定!

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值