首页
前端面试题
前端报错总结
电子书
更多
插件下载
Search
1
JavaScript基础(二)操作符 流程控制
42 阅读
2
HTML基础
20 阅读
3
Vue基础
17 阅读
4
wctype.h
14 阅读
5
Vue2(知识点)
13 阅读
默认分类
HTML CSS
HTML基础
CSS
HTML5 CSS3
javaScript
javaScript基础
javaScript高级
Web APIs
jQuery
js小总结
WEB开发布局
Vue
PS切图
数据可视化
Git使用
Uniapp
c语言入门
标准库
嵌入式
登录
Search
liuxiaobai
累计撰写
108
篇文章
累计收到
12
条评论
首页
栏目
默认分类
HTML CSS
HTML基础
CSS
HTML5 CSS3
javaScript
javaScript基础
javaScript高级
Web APIs
jQuery
js小总结
WEB开发布局
Vue
PS切图
数据可视化
Git使用
Uniapp
c语言入门
标准库
嵌入式
页面
前端面试题
前端报错总结
电子书
插件下载
搜索到
41
篇与
的结果
2023-09-20
Enum 类型(枚举类型)
Enum 类型如果一种数据类型的取值只有少数几种可能,并且每种取值都有自己的含义,为了提高代码的可读性,可以将它们定义为 Enum 类型,中文名为枚举。enum colors {RED, GREEN, BLUE}; printf("%d\n", RED); // 0 printf("%d\n", GREEN); // 1 printf("%d\n", BLUE); // 2上面示例中,假定程序里面需要三种颜色,就可以使用enum命令,把这三种颜色定义成一种枚举类型colors,它只有三种取值可能RED、GREEN、BLUE。这时,这三个名字自动成为整数常量,编译器默认将它们的值设为数字0、1、2。相比之下,RED要比0的可读性好了许多。注意,Enum 内部的常量名,遵守标识符的命名规范,但是通常都使用大写。使用时,可以将变量声明为 Enum 类型。enum colors color;上面代码将变量color声明为enum colors类型。这个变量的值就是常量RED、GREEN、BLUE之中的一个。color = BLUE; printf("%i\n", color); // 2上面代码将变量color的值设为BLUE,这里BLUE就是一个常量,值等于2。typedef 命令可以为 Enum 类型起别名。typedef enum { SHEEP, WHEAT, WOOD, BRICK, ORE } RESOURCE; RESOURCE r;上面示例中,RESOURCE是 Enum 类型的别名。声明变量时,使用这个别名即可。还有一种不常见的写法,就是声明 Enum 类型时,在同一行里面为变量赋值。enum { SHEEP, WHEAT, WOOD, BRICK, ORE } r = BRICK, s = WOOD;上面示例中,r的值是3,s的值是2。由于 Enum 的属性会自动声明为常量,所以有时候使用 Enum 的目的,不是为了自定义一种数据类型,而是为了声明一组常量。这时就可以使用下面这种写法,比较简单。enum { ONE, TWO }; printf("%d %d", ONE, TWO); // 0 1上面示例中,enum是一个关键字,后面跟着一个代码块,常量就在代码内声明。ONE和TWO就是两个 Enum 常量。常量之间使用逗号分隔。最后一个常量后面的尾逗号,可以省略,也可以保留。enum { ONE, TWO, };由于Enum 会自动编号,因此可以不必为常量赋值。C 语言会自动从0开始递增,为常量赋值。但是,C 语言也允许为 ENUM 常量指定值,不过只能指定为整数,不能是其他类型。因此,任何可以使用整数的场合,都可以使用 Enum 常量。enum { ONE = 1, TWO = 2 }; printf("%d %d", ONE, TWO); // 1 2Enum 常量可以是不连续的值。enum { X = 2, Y = 18, Z = -2 };Enum 常量也可以是同一个值。enum { X = 2, Y = 2, Z = 2 };如果一组常量之中,有些指定了值,有些没有指定。那么,没有指定值的常量会从上一个指定了值的常量,开始自动递增赋值。enum { A, // 0 B, // 1 C = 4, // 4 D, // 5 E, // 6 F = 3, // 3 G, // 4 H // 5 };Enum 的作用域与变量相同。如果是在顶层声明,那么在整个文件内都有效;如果是在代码块内部声明,则只对该代码块有效。如果与使用int声明的常量相比,Enum 的好处是更清晰地表示代码意图。
2023年09月20日
2 阅读
0 评论
0 点赞
2023-09-20
Union 结构(共用体、联合体)
Union 结构有时需要一种数据结构,不同的场合表示不同的数据类型。比如,如果只用一种数据结构表示水果的“量”,这种结构就需要有时是整数(6个苹果),有时是浮点数(1.5公斤草莓)。C 语言提供了 Union 结构,用来自定义可以灵活变更的数据结构。它内部包含各种属性,但是所有属性共用一块内存,导致这些属性都是对同一个二进制数据的解读,其中往往只有一个属性的解读是有意义的。并且,后面写入的属性会覆盖前面的属性,这意味着同一块内存,可以先供某一个属性使用,然后再供另一个属性使用。这样做的最大好处是节省内存空间。union quantity { short count; float weight; float volume; };上面示例中,union命令定义了一个包含三个属性的数据类型quantity。虽然包含三个属性,但是只能写入一个值,三个属性都是对这个值的不同解读。最后赋值的属性,往往就是可以取到有意义的值的那个属性。使用时,声明一个该类型的变量。// 写法一 union quantity q; q.count = 4; // 写法二 union quantity q = {.count=4}; // 写法三 union quantity q = {4};上面代码展示了为 Union 结构赋值的三种写法。最后一种写法不指定属性名,就会赋值给第一个属性。执行完上面的代码以后,q.count可以取到值,另外两个属性取不到值。printf("count is %i\n", q.count); // count is 4 printf("weight is %f\n", q.weight); // 未定义行为如果要让q.weight属性可以取到值,就要先为它赋值。q.weight = 0.5; printf("weight is %f\n", q.weight); // weight is 0.5一旦为其他属性赋值,原先可以取到值的q.count属性就跟着改变,使用它可能就没有意义了。除了这一点,Union 结构的其他用法与 Struct 结构,基本上是一致的。Union 结构也支持指针运算符->。union quantity { short count; float weight; float volume; }; union quantity q; q.count = 4; union quantity* ptr; ptr = &q; printf("%d\n", ptr->count); // 4上面示例中,ptr是q的指针,那么ptr->count等同于q.count。Union 结构指针与它的属性有关,当前正在按照哪个属性解读数据,它的指针就是对应的数据类型。union foo { int a; float b; } x; int* foo_int_p = (int *)&x; float* foo_float_p = (float *)&x; x.a = 12; printf("%d\n", x.a); // 12 printf("%d\n", *foo_int_p); // 12 x.b = 3.141592; printf("%f\n", x.b); // 3.141592 printf("%f\n", *foo_float_p); // 3.141592上面示例中,&x是 foo 结构的指针,它的数据类型完全由当前赋值的属性决定。typedef 命令可以为 Union 数据类型起别名。typedef union { short count; float weight; float volume; } quantity;上面示例中,union命令定义了一个包含三个属性的数据类型,typedef命令为它起别名为quantity。Union 结构的好处,主要是节省空间。它将一段内存空间,重用于不同类型的数据。定义了三个属性,但同一时间只用到一个,使用 Union 结构就可以节省另外两个属性的空间。Union 结构占用的内存长度,等于它内部最长属性的长度。
2023年09月20日
2 阅读
0 评论
0 点赞
2023-09-20
typedef 命令(类型定义)
typedef 命令简介typedef命令用来为某个类型起别名。typedef type name;上面代码中,type代表类型名,name代表别名。typedef unsigned char BYTE; BYTE c = 'z';上面示例中,typedef命令为类型unsign char起别名BYTE,然后就可以使用BYTE声明变量。typedef 可以一次指定多个别名。typedef int antelope, bagel, mushroom;上面示例中,一次性为int类型起了三个别名。typedef 可以为指针起别名。typedef int* intptr; int a = 10; intptr x = &a;上面示例中,intptr是int*的别名。不过,使用的时候要小心,这样不容易看出来,变量x是一个指针类型。typedef 也可以用来为数组类型起别名。typedef int five_ints[5]; five_ints x = {11, 22, 33, 44, 55};上面示例中,five_ints是一个数组类型,包含5个整数的typedef 为函数起别名的写法如下。typedef signed char (*fp)(void);上面示例中,类型别名fp是一个指针,代表函数signed char (*)(void)。主要好处typedef为类型起别名的好处,主要有下面几点。(1)更好的代码可读性。typedef char* STRING; STRING name;上面示例为字符指针起别名为STRING,以后使用STRING声明变量时,就可以轻易辨别该变量是字符串。(2)为 struct、union、enum 等命令定义的复杂数据结构创建别名,从而便于引用。struct treenode { // ... }; typedef struct treenode* Tree;上面示例中,Tree为struct treenode*的别名。typedef 也可以与 struct 定义数据类型的命令写在一起。typedef struct animal { char* name; int leg_count, speed; } animal;上面示例中,自定义数据类型时,同时使用typedef命令,为struct animal起了一个别名animal。这种情况下,C 语言允许省略 struct 命令后面的类型名。typedef struct { char *name; int leg_count, speed; } animal;上面示例相当于为一个匿名的数据类型起了别名animal。(3)typedef 方便以后为变量改类型。typedef float app_float; app_float f1, f2, f3;上面示例中,变量f1、f2、f3的类型都是float。如果以后需要为它们改类型,只需要修改typedef语句即可。typedef long double app_float;上面命令将变量f1、f2、f3的类型都改为long double。(4)可移植性某一个值在不同计算机上的类型,可能是不一样的。int i = 100000;上面代码在32位整数的计算机没有问题,但是在16位整数的计算机就会出错。C 语言的解决办法,就是提供了类型别名,在不同计算机上会解释成不同类型,比如int32_t。int32_t i = 100000;上面示例将变量i声明成int32_t类型,保证它在不同计算机上都是32位宽度,移植代码时就不会出错。这一类的类型别名都是用 typedef 定义的。下面是类似的例子。typedef long int ptrdiff_t; typedef unsigned long int size_t; typedef int wchar_t;这些整数类型别名都放在头文件stdint.h,不同架构的计算机只需修改这个头文件即可,而无需修改代码。因此,typedef有助于提高代码的可移植性,使其能适配不同架构的计算机。(5)简化类型声明C 语言有些类型声明相当复杂,比如下面这个。char (*(*x(void))[5])(void);typedef 可以简化复杂的类型声明,使其更容易理解。首先,最外面一层起一个类型别名。typedef char (*Func)(void); Func (*x(void))[5];这个看起来还是有点复杂,就为里面一层也定义一个别名。typedef char (*Func)(void); typedef Func Arr[5]; Arr* x(void);上面代码就比较容易解读了。x是一个函数,返回一个指向 Arr 类型的指针。Arr是一个数组,有5个成员,每个成员是Func类型。Func是一个函数指针,指向一个无参数、返回字符值的函数。
2023年09月20日
3 阅读
0 评论
0 点赞
1
...
9
10
11
...
14