ISO/IEC 9899:2011 条款6.8.6——跳转语句
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——跳转语句的更多相关文章
- ISO/IEC 9899:2011 条款3——术语、定义与符号
3. 术语.定义与符号 1.对于此国际标准的意图,应用了以下定义.其它术语是在用斜体类型或一个语法规则左侧出现的地方定义.在本国际标准中所显式定义的术语不被假定为对其它地方所定义的类似术语的隐式引用. ...
- ISO/IEC 9899:2011 条款5——5.2.1 字符集
5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...
- ISO/IEC 9899:2011 条款6.4.2——标识符
6.4.2 标识符 6.4.2.1 通用 语法 1.identifier: identifier-nodigit identifier identifier-nondigit identifie ...
- ISO/IEC 9899:2011 条款6.4.3——通用字符名
6.4.3 通用字符名 语法 1.通用字符名: universal_character-name: \u hex-quad(四位十六进制数) \U hex-quad hex-quad hex-quad ...
- ISO/IEC 9899:2011 条款5——5.1.2 执行环境
5.1.2 执行环境 1.定义了两个执行环境:独立式(freestanding)以及宿主的(hosted).在这两种情况下,当一个派定的C函数被执行环境调用时,程序就启动.所有具有静态存储周期的对象应 ...
- ISO/IEC 9899:2011 条款4——标准顺从
4. 标准顺从 1.在本国际标准中,“应该”被解释为对一个实现或一个程序的要求:相反地,“不该”被解释为禁用. 2.如果违反了出现在一个强制规定或运行时强制规定之外的“应该”或“不该”要求,那么该行为 ...
- ISO/IEC 9899:2011 条款6——语言
6 语言 6.1 标记法 1.在本条款中所使用的语法标记法.语义类别(非终结符)用斜体字指示,而字面量单词以及字符集成员(终结符)用粗体字指示.跟在一个非终结符后面的冒号(:)引出其定义.在单独的行中 ...
- ISO/IEC 9899:2011 条款6.3——转换
6.3 转换 1.有些操作符将操作数的值自动地从一种类型转换为另一种.本子条款指定了从这么一个隐式转换所要求的结果,以及从一个投射操作(一个显式转换)所要求的结果.在6.3.1.8中所列出的信息概括了 ...
- ISO/IEC 9899:2011 条款6.5——表达式
6.5 表达式 1.一个表达式是操作符与操作数的一个序列,这些操作符与操作数指定了一个值的计算,或指派一个对象或一个函数,或是生成副作用,或执行上述操作的组合.对一个操作符的操作数的值计算顺序排在对该 ...
随机推荐
- Java精通并发-synchronized关键字原理详解
关于synchronized关键字原理其实在当时JVM的学习[https://www.cnblogs.com/webor2006/p/9595300.html]中已经剖析过了,这里从研究并发专题的角度 ...
- redis cluster集群的原理
redis集群的概述: 在以前,如果前几年的时候,一般来说,redis如果要搞几个节点,每个节点存储一部分的数据,得借助一些中间件来实现,比如说有codis,或者twemproxy,都有.有一些red ...
- 「TJOI2018」str
碱基序列 题目描述 小豆参加了生物实验室.在实验室里,他主要研究蛋白质.他现在研究的蛋白质是由$k$个氨基酸按一定顺序构成的.每一个氨基酸都可能有$a$种碱基序列$s_{i,j}$构成. 现在小豆有一 ...
- Linux安装版本solr-5.3.0
准备材料:solr-5.3.0.tgz 下载路径:http://mirrors.hust.edu.cn/apache/lucene/solr/ 安装solr 1.解压solr [root@svn-se ...
- python递归的最大层数?
Python的最大递归层数是可以设置的,默认的在window上的最大递归层数是 998. 可以通过sys.setrecursionlimit()进行设置,但是一般默认不会超过3925-3929这个范围 ...
- Maximal Square II
Description Given a 2D binary matrix filled with 0's and 1's, find the largest square which diagonal ...
- PAT乙级1040 有几个PAT
题目: 1040 有几个PAT (25分) 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位 ...
- vue中插槽作用域的使用
一.插槽作用域 1.简单来说就是带参数的插槽: 2.使用方式: 在组件标签内部加一个template标签 在template标签上加一个属性scope 值随意书写 在组件内部用slot进行接受,如果给 ...
- javaweb上传文件夹
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...
- 2017.10.7 国庆清北 D7T1 计数
题目描述 给出m个数a[1],a[2],…,a[m] 求1~n中有多少数不是a[1],a[2],…,a[m]的倍数. 输入输出格式 输入格式: 输入文件名为count.in. 第一行,包含两个整数:n ...