6.8.6 跳转语句

语法

1、jump-statement:

goto    identifier    ;

continue    ;

break    ;

return    expressionopt    ;

语义

2、一条跳转语句引发一个无条件跳转到另一个地方。

6.8.6.1 goto语句

约束

1、一条goto语句中的标识符应该命名一个标签,该标签坐落于当前封闭函数的某个地方。一条goto语句不应该从一个具有可变修改类型的标识符作用域的外部跳转到该标识符作用域的内部。

语义

2、一条goto语句引发一次无条件跳转到在封闭函数中由命名标签作为前缀的语句处。

3、例1 有时为了图方便而跳入到一组复杂语句集的中间。以下概述呈现了一个基于三个假定问题的可能解决方法:

(1)通用的初始化代码仅访问对当前函数可见的对象。

(2)通用初始化代码太大,以至于难以重复。

(3)要判定下一步操作的代码在循环的开头。(为了允许它来通过continue语句而到达,比如)

/* ... *
goto first_time;
for( ; ;) {
// 判定下一步操作
/* ... */
if( 需要重新初始化) {
// 仅仅重新初始化代码
/* ... */
first_time:
// 通用初始化代码
/* ... */
continue;
}
// 处理其它操作
/* ... */
}

4、例2 一条goto语句并不允许跳过任何可变修改类型的对象声明。在作用域范围内的一次跳转是被允许的。

goto lab3;    // 无效:跳转到VLA的作用域
{
double a[n];
a[j] = 4.4;
lab3:
a[j] = 3.3';
goto lab4; // 有效:在VLA的作用域内跳转
lab4:
a[j] = 6.6;
}
goto lab4; // 无效:跳转到VLA的作用域

6.8.6.2 continue语句

约束

1、一条continue语句应该仅出现在一个循环体内,或者作为一个循环体出现。

语义

2、一条continue语句使得一个跳转到封闭迭代语句的最小循环继续部分;也就是说,循环体的末尾。更精确地说,在每条语句中

while (/* ... */) {
/* ... */
continue;
/* ... */
contin: ;
} do {
/* ... */
continue;
/* ... */
contin: ;
} while (/* ... */); for (/* ... */) {
/* ... */
continue;
/* ... */
contin: ;
}

上述代码中,除非continue语句在一条封闭的迭代语句内(在这种情况下,它在那条语句内解析),否则它就等价于goto contin;。[注:跟在contin:标签之后的是一条空语句。]

6.8.6.3 break语句

约束

1、一条break语句应该仅出现在一条switch体或循环体中,或作为一个switch体或循环体。

语义

2、一条break语句终结了最小封闭的switch或迭代语句的执行。

6.8.6.4 return语句

约束

1、一条带有一个表达式的return语句不应该出现在返回类型是void的一个函数中。一条不带表达式的return语句应该仅出现在返回类型是void的函数中。

语义

2、一条return语句终止当前函数的执行,并将控制返回给其调用者。一个函数可以具有任意数量的return语句。

3、如果一条return语句带有一个要被执行的表达式,表达式的值作为函数调用表达式的值返回给调用者。如果表达式具有一个不同于函数的返回类型的一个类型,那么该值被转换,就好比赋值给一个具有函数返回类型的一个对象。[注:return语句并不是一个赋值。子条款6.5.16.1的跌交限制并不应用于函数返回的情况。浮点值的表示可以具有比类型所指示的更宽广的精度范围;一个投射可以被用于移除此额外的范围和精度。]

4、例:在以下代码片段

struct s { double i; } f(void);
union {
struct {
int f1;
struct s f2;
} u1;
struct {
struct s f3;
int f4;
} u2;
} g;
struct s f(void)
{
return g.u1.f2;
}
/* ... */
g.u2.f3 = f();

这里没有未定义行为,尽管如果直接做赋值可能会有(没有使用一个函数调用来获取该值)。

ISO/IEC 9899:2011 条款6.8.6——跳转语句的更多相关文章

  1. ISO/IEC 9899:2011 条款3——术语、定义与符号

    3. 术语.定义与符号 1.对于此国际标准的意图,应用了以下定义.其它术语是在用斜体类型或一个语法规则左侧出现的地方定义.在本国际标准中所显式定义的术语不被假定为对其它地方所定义的类似术语的隐式引用. ...

  2. ISO/IEC 9899:2011 条款5——5.2.1 字符集

    5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...

  3. ISO/IEC 9899:2011 条款6.4.2——标识符

    6.4.2 标识符 6.4.2.1 通用 语法 1.identifier: identifier-nodigit identifier    identifier-nondigit identifie ...

  4. ISO/IEC 9899:2011 条款6.4.3——通用字符名

    6.4.3 通用字符名 语法 1.通用字符名: universal_character-name: \u hex-quad(四位十六进制数) \U hex-quad hex-quad hex-quad ...

  5. ISO/IEC 9899:2011 条款5——5.1.2 执行环境

    5.1.2 执行环境 1.定义了两个执行环境:独立式(freestanding)以及宿主的(hosted).在这两种情况下,当一个派定的C函数被执行环境调用时,程序就启动.所有具有静态存储周期的对象应 ...

  6. ISO/IEC 9899:2011 条款4——标准顺从

    4. 标准顺从 1.在本国际标准中,“应该”被解释为对一个实现或一个程序的要求:相反地,“不该”被解释为禁用. 2.如果违反了出现在一个强制规定或运行时强制规定之外的“应该”或“不该”要求,那么该行为 ...

  7. ISO/IEC 9899:2011 条款6——语言

    6 语言 6.1 标记法 1.在本条款中所使用的语法标记法.语义类别(非终结符)用斜体字指示,而字面量单词以及字符集成员(终结符)用粗体字指示.跟在一个非终结符后面的冒号(:)引出其定义.在单独的行中 ...

  8. ISO/IEC 9899:2011 条款6.3——转换

    6.3 转换 1.有些操作符将操作数的值自动地从一种类型转换为另一种.本子条款指定了从这么一个隐式转换所要求的结果,以及从一个投射操作(一个显式转换)所要求的结果.在6.3.1.8中所列出的信息概括了 ...

  9. ISO/IEC 9899:2011 条款6.5——表达式

    6.5 表达式 1.一个表达式是操作符与操作数的一个序列,这些操作符与操作数指定了一个值的计算,或指派一个对象或一个函数,或是生成副作用,或执行上述操作的组合.对一个操作符的操作数的值计算顺序排在对该 ...

随机推荐

  1. Linux命令基础3-cd命令

    cd 到带空格的文件夹 [root@cctg-sjc16-grafana ccatgbld]# cd 'my test' [root@cctg-sjc16-grafana my test]# cd . ...

  2. [Angular 8] Keep original DOM structure with ng-container

    ng-container is using for grouping elments together, a bit similar to div. If you want to group some ...

  3. Docker+GitLab+Jenkins+kubernetes实现DevOps 持续化集成和持续化部署概念图

    Docker+GitLab+Jenkins+kubernetes实现DevOps 持续化集成和持续化部署概念图 转载自:原创 IT综合 作者:百联达 时间:2017-05-09 15:48:08 41 ...

  4. mage Ansible学习3 ansible role实例

    一.ansible配置文件解析 1./etc/ansible/ansible.cfg配置文件详解 [root@node3 ~]# cat /etc/ansible/ansible.cfg |grep ...

  5. asp.net实现大文件上传分片上传断点续传

    HTML部分 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.a ...

  6. C# 线程小结

    进程与线程 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源. 而一个进程又是由多个线程所组成的. 什么是线程? 线程是程序中的一个执行流,每个线 ...

  7. AQS面试题

    问:什么是AQS? 答:AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包下面.AQS是一个用来构建锁和同步器的框架 ...

  8. 留言板welcome here friends!

    欢迎留言!!! 另附本人信息栏 \(cnblogs\): ShineEternal \(洛谷\):vercont \(CSDN\) \(blog\): ShineEternal \(github\) ...

  9. Linux安装配置JDK与卸载

    最近在Linux系统部署门户,安装Oracle,导入dmp,JDK等等,遇到一大堆问题,解决后特有一番小小成就感,哇哈哈!在这里记录一下遇到问题: 官网下载JDK压缩包( .tar.gz ):http ...

  10. CLion201914 下载安装

    链接:https://pan.baidu.com/s/12Gzo8gL3iUFoL5wok6L_BQ  密码:7vw4 56ZS5PQ1RF-eyJsaWNlbnNlSWQiOiI1NlpTNVBRM ...