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.一个表达式是操作符与操作数的一个序列,这些操作符与操作数指定了一个值的计算,或指派一个对象或一个函数,或是生成副作用,或执行上述操作的组合.对一个操作符的操作数的值计算顺序排在对该 ...
随机推荐
- 《hello-world》第九次团队作业:【Beta】Scrum meeting 1
项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十三 团队作业9:Beta冲刺与团队项目验收 团队名称 <hello--wor ...
- test20190825 AmberFrame
100+0+99=199,第二题一分没得不应该. count 给定 \(n\),求合法的 \((x_1,x_2,x_3,\dots,x_{2m})\) 组数.一组 \(x\) 是合法的,当且仅当 \[ ...
- 题解 UVa10943
题目大意 多组数据,每组数据给定两个整数 \(n,k\),求出用 \(k\) 个不超过 \(n\) 的数相加得到 \(n\) 的方案数(不同顺序不算同种). 分析 计数水题.令 \(f_{i,j}\) ...
- python - ORM 查询
1. 正常查询: ## 效率低,因为每次查询都是查询表和关联表的所有数据 ret = User.objects.all() for item in ret: print(item.name,item. ...
- Djiango权限组件
一. login中注册 权限url def login(request): if request.method == "POST": username = request.POST ...
- 洛谷 P1373 小a和uim之大逃离 题解
每日一题 day30 打卡 Analysis f[i][j][p][q]表示他们走到(i,j),且两人魔瓶内魔液量的差为p时的方法数.q=0表示最后一步是小a走的,q=1表示最后一步是uim走的.题目 ...
- javascript之大文件分段上传、断点续传
这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...
- .net之大文件断点续传
HTML部分 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.a ...
- 内核中PID_HANDLE_OBJECT等互相转换
目录 一丶简介 1.进程pid 转化为 HANDLE 2.Handle --------> 转化为 PID 3.Pid ------> Object(EPROCESS) 4. HANDLE ...
- ShellExecute打开文件,打开文件夹的用法
转自https://www.cnblogs.com/nxopen2018/p/11070031.html //方法1 //转换 //char msg[256]; //sprintf_s(msg, &q ...