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基础(10)---stream流
一.stream的应用场景 for遍历的冗余场景: stream的写法: 二.获取Stream流的常用方式 三.Stream的map映射方法 更简单的写法: 四.Stream的filter过滤方法 ...
- Spring -11 -单例设计模式 -懒汉式/饿汉式(idea默认的)
单例设计模式 作用: 在应用程序有保证最多只能有一个实例. 好处: 2.1 提升运行效率. 2.2 实现数据共享. 案例:application 对象 懒汉式 3.1 对象只有被调用时才去创建. 3. ...
- Shell排序——软考(五)
希尔排序是一种插入排序,是对直接插入排序的一种改进,该算法出自于D.L.Shell,因此得名为希尔.Shell排序又名缩小增量排序. 思想 假设初始序列为n个元素,先取一个小于n的整数d1作 ...
- PL/sql配置相关
可以安装oracle之后,打开PL/sql之后,自动找到oracle的路径以及数据库连接. 或者:安装oracle客户端,手动在PL/sql中配置oic以及oracle主目录的位置,并且配置好C: ...
- 3-html块-语义化的标签
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- python关于字典嵌套字典,列表嵌套字典根据值进行排序
python 对于字典嵌套字典, 列表嵌套字典排序 例:列表嵌套自字典:d = [{"name": '张三', 's': 68}, {'name': '李四', 's': 97}] ...
- C++ 类的静态成员
https://www.cnblogs.com/lvxiaoning/p/7598062.html
- K Edit Distance
Description Given a set of strings which just has lower case letters and a target string, output all ...
- 015_Python3 迭代器与生成器
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...
- Python3正则表达式
正则表达式是一个特殊的字符序列,他能帮助你方便的检查一个字符串是否与某种模式匹配. re.match函数 re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,matc ...