第8课 goto和void分析

时间:2022-03-02 02:40:51

遭人遗弃的goto:

第8课   goto和void分析

C语言是一种面向过程的结构化语言,其中主要结构有三种,顺序执行、选择执行、循环执行。再复杂的程序也是由这三种结构组合而成的。

goto破坏了结构化特性,使程序以第四种方式执行,结构化特性被破坏的越严重程序质量越下降。

现代软件开发中很多企业禁用goto。

goto破坏结构化特性的示例:

 #include <stdio.h>
#include <malloc.h> void func(int n)
{
int* p = NULL; if( n < )
{
goto STATUS;
} p = (int*)malloc(sizeof(int) * n); STATUS:
p[] = n; free(p);
} int main()
{
printf("begin...\n"); printf("func(1)\n"); func(); printf("func(-1)\n"); func(-); printf("end...\n"); return ;
}

程序在第10行直接跳转到第16行,则14行就得不到执行,我们在第17行赋值就会出错。当n大于0才可以正常执行。

运行结果如下:

第8课   goto和void分析

32行的调用会导致程序崩溃。

void的意义:

第8课   goto和void分析

函数如果没有返回值应该定义成void,否则默认为int型。不接受参数的话要定义成void,否则默认接受任意参数。因为C语言并不是一门强类型的语言。不写返回值类型C语言编译器并不认为是错的。

如果函数不接受任何参数,也没有返回值,那么一定要定义成void。

不存在void变量:void是一种抽象类型,C语言规范并没有定义void的具体大小,是一种概念上的抽象类型

第8课   goto和void分析

虽然不可以定义void类型的变量,但是可以定义void类型的指针。因为指针类型要么四个字节要么八个字节。viod*可以在内存中确定大小。

小贴士:

第8课   goto和void分析

ANSI没有定义void的大小,在gcc编译器中做了扩展,对void定义了大小,可以使用sizeof求void大小。

上面程序片段的执行结果如下:

第8课   goto和void分析

上述代码在bcc编译器中会编译出错。

在写C语言时要以标准C为准。

void指针的意义:

第8课   goto和void分析

void*是一种更大的类型,可以接受任意指针类型。

程序示例:

 #include <stdio.h>

 void MemSet(void* src, int length, unsigned char n)
{
unsigned char* p = (unsigned char*)src; int i = ; for(i=; i<length; i++)
{
p[i] = n;
}
} int main()
{
int a[];
int i = ; MemSet(a, sizeof(a), ); for(i=; i<; i++)
{
printf("%d\n", a[i]);
} return ;
}

MemSet的第一个参数是void*,我们要设置一段内存的值,并不关心这段内存是char*还是int*的,因此,第一个参数为void*类型,可以接受任意类型的指针。

执行结果如下:

第8课   goto和void分析

小结:

第8课   goto和void分析

第8课 goto和void分析的更多相关文章

  1. 第8课 goto 和 void 分析

    1. 遭人遗弃的goto (1)高手潜规则:禁用goto (2)项目经验:程序质量与goto出现的次数成反比 (3)最后的判决:将goto打入冷宫(1)循环语句的基本工作方式 [实例分析]goto副作 ...

  2. C语言进阶——goto 和 void 的分析08

    遭人遗弃的goto: 高手潜规则:禁止使用goto 项目经验:程序质量与goto的出现次数成反比 最后的判决:将goto打入冷宫 程序示例1:(goto副作用分析) #include <stdi ...

  3. 第9课 - const 和 volatile分析

    第9课 - const和volatile分析 1. const只读变量 (1)const修饰的变量是只读的,本质上还是变量,并不是真正意义上的常量         ※※ const只是告诉编译器该变量 ...

  4. 第11课 - enum&comma; sizeof&comma; typedef 分析

    第11课 - enum, sizeof, typedef 分析 1. enum介绍 (1)enum是C语言中的一种自定义类型,和struct.union地位相同,格式如下: // enum每个值的最后 ...

  5. 第10课 struct 和 union 分析

    1. struct的小秘密 (1)C语言中的struct可以看作变量的集合 (2)struct的问题——空结构体占用多的内存? [实例分析]空结构体的大小 #include <stdio.h&g ...

  6. 第9课 const和volatile分析

    1. const只读变量——(注意不是真正常量,只是告诉编译器不能出现在赋值号左边!) (1)const修饰的变量是只读的,本质还是变量 (2)const修饰的局部变量在栈上分配空间 (3)const ...

  7. 第10课 struct和union分析

    struct的小秘密:空结构体占多大内存呢? 直观的答案有两种: 1.空结构体的大小为0 2.结构体本来就是为了将不同的变量集合在一起使用的,定义空结构体会导致编译错误 实例分析: #include ...

  8. 【第三课】kaggle案例分析三

    Evernote Export 比赛题目介绍 TalkingData是中国最大的第三方移动数据平台,移动设备用户日常的选择和行为用户画像.目前,TalkingData正在寻求每天在中国活跃的5亿移动设 ...

  9. 第2课 GUI程序实例分析

    1. GUI程序开发概述 (1)现代操作系统提供原生SDK支持GUI程序开发 (2)GUI程序开发是现代操作系统上的主流技术 (3)不同操作系统上的GUI开发原理相同 (4)不同操作系统上的GUI S ...

随机推荐

  1. js 动态添加input代码

    <script type="text/javascript" language="javascript"> function newNode(thi ...

  2. windows系统下的第一个console程序

    窗口+r 键,输入cmd,打开一个命令行窗口 切换到你的目标目录 输入 dotnet new dotnet会自动帮你创建3个文件. NuGet.Config文件主要定义了NuGet获取nupkg包时的 ...

  3. 模拟 Codeforces Round &num;288 &lpar;Div&period; 2&rpar; A&period; Pasha and Pixels

    题目传送门 /* 模拟水题:给定n*m的空白方格,k次涂色,将(x,y)处的涂成黑色,判断第几次能形成2*2的黑色方格,若不能,输出0 很挫的判断四个方向是否OK */ #include <cs ...

  4. 生成器&lpar;generator&rpar;内部解析

    #http://kb.cnblogs.com/page/87128/(未看完)

  5. 周赛-KIDx&&num;39&semi;s Pagination 分类: 比赛 2015-08-02 08&colon;23 7人阅读 评论&lpar;0&rpar; 收藏

    KIDx's Pagination Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) S ...

  6. C&sol;C&plus;&plus; 笔试、面试题目大汇总 转

    C/C++ 笔试.面试题目大汇总 这些东西有点烦,有点无聊.如果要去C++面试就看看吧.几年前网上搜索的.刚才看到,就整理一下,里面有些被我改了,感觉之前说的不对或不完善. 1.求下面函数的返回值( ...

  7. &lbrack;Leetcode&rsqb;&lbrack;Python&rsqb;30&colon; Substring with Concatenation of All Words

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 30: Substring with Concatenation of All ...

  8. sql表连接的几种方式

    这里有两张表TableA和TableB,分别是姓名表和年龄表,用于我们例子的测试数据 TableA id name 1 t1 2 t2 4 t4 TableB id age 1 18 2 20 3 1 ...

  9. Spring Boot整合Mybatis并完成CRUD操作

    MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官 ...

  10. CmD空格转义的三种方法,总有一种会解决问题

    CmD空格转义 在cmd中,如果路径中存在空格报错 可以有三种解决方法: 1.将存在空格的路径用双引号包起来,如:"D:/Program Files/xx"; 2.将存在空格的名称 ...