ISO/IEC 9899:2011 条款6.5.6——加法操作符
6.5.6 加法操作符
语法
1、additive-expression:
multiplication-expression
additive-expression + multiplication-expression
additive-expression - multiplication-expression
约束
2、对于加法,要么操作数都应该具有算术类型,要么其中一个操作数应该是一个指向一个完整对象类型的指针,而另一个应该具有整数类型。(递增等价于加1。)
3、对于减法,应该遵守下列条款其中之一:
——两个操作数都具有算术类型;
——两个操作数都是指向兼容完整对象类型的限定的或非限定的版本;或
——左操作数是一个指向一个完整对象类型的一个指针,且右操作数具有整数类型。(递减等价于减1。)
语义
4、如果两个操组数都具有算术类型,那么通常的算术转换对这两个操作数上执行。
5、双目 + 操作符的结果是操作数的和。
6、双目 - 操作符的结果是第一个操作数减去第二个操作数的差。
7、出于对这些操作符的目的,一个指向一个对象的指针,该对象不是一个数组的元素,那么行为与指向一个长度为1的数组的第一个元素的指针相同,该对象的类型作为其元素类型。
8、当具有一个整数类型的一个表达式被加到或用一个指针去减的时候,该结果具有指针操作数类型。如果指针操作数指向一个数组对象的一个元素,并且该数组足够大,那么结果为指向从原始元素的一个元素偏移,诸如结果下标和原始数组元素的差等于整数表达式。换句话说,如果表达式是P指向一个数组对象的第i个元素,那么表达是(P) + N(等价于N + (P))与(P) - N(这里,N具有值n),分别指向数组对象的第i+n个与第i-n个元素,在它们退出时提供。此外,如果表达式P指向指向一个数组对象的最后一个元素,那么表达式(P) + 1指向越过一个数组对象的最后一个元素,并且如果表达式Q指向超过一个数组对象的最后一个元素,那么表达式(Q) - 1指向一个数组对象的最后一个元素。如果两个指针操作数与指向同一数组对象的元素的结果,或者一个超过一个数组对象最后一个元素,那么计算不应该产生一个上溢;否则,该行为是未定义的。如果该结果指向一个超过数组对象的最后一个元素,那么它不应该被用作为一个要被计算的单目 * 操作符的操作数。
9、当两个指针相减时,两个指针都应该指向同一个数组对象的元素,或者超过数组对象最后一个元素;结果是两个数组元素的下标的差。结果的大小是实现定义的,并且其类型(一个带符号整数类型)是定义在<stddef.h>头文件中的ptrdiff_t。如果结果不能用该类型的一个对象来表示,那么行为是未定义的。换句话说,如果表达式P和Q分别指向一个数组对象的第i个以及第j个元素,那么表达式(P) - (Q)具有值i-j所提供的值适应于类型ptrdiff_t的一个对象。此外,如果表达式P要么指向一个数组对象的一个元素,要么指向超过一个数组对象的最后一个元素,并且表达式Q指向同一数组对象的最后一个元素,那么表达式 ((Q) + 1) - (P)) 具有与((Q) - P) + 1)和-((P) - ((Q) + 1))相同的值,如果表达式P指向一个超过一个数组对象最后一个元素,那么具有值零,即便表达式(Q) + 1并不指向一个数组对象的一个元素。[注:实现指针算术的另一种方法是先将指针转换为字符指针;在这种模式下,整数表达式与被转换的指针相加,或被转换的指针减去该整数表达式,先乘以原始被指的对象的大小,然后结果指针被转换回原始类型。对于指针减法,在字符指针之间的差类似于乘以原始所指的对象的大小。当用这种视角去看时,一个实现不仅需要提供一个额外的字节(这可能在程序中跌交另一个对象),恰好在对象末尾之后,为了满足“一个超过最后一个元素”的要求。]
10、例 指针算术用指向可变长度数组类型是良好定义的。
{
int n = , m =
int a[n][m];
int (*p)[m] = a; // p == &a[0]
p += ; // p == &a[1]
(*p)[] = ; // a[1][2] == 99
n = p - a; // n == 1
}
11、如果上述例子中的数组a被声明为已知常量大小的一个数组,并且指针p被声明为指向一个相同已知常量大小的数组(指向a),结果将是相同的。
ISO/IEC 9899:2011 条款6.5.6——加法操作符的更多相关文章
- ISO/IEC 9899:2011 条款6.5.17——逗号操作符
6.5.17 逗号操作符 语法 1.expression: assignment-expression expression , assignment-expression 语义 2.一个 ...
- ISO/IEC 9899:2011 条款6.5.16——赋值操作符
6.5.16 赋值操作符 语法 1.assignment-expression: conditional-expression unary-expression assignment-opera ...
- ISO/IEC 9899:2011 条款6.5.15——条件操作符
6.5.15 条件操作符 语法 1.conditional-expression: logical-OR-expression logical-OR-expression ? expres ...
- ISO/IEC 9899:2011 条款6.5.9——相等操作符
6.5.9 相等操作符 语法 1.equality-expression: relational-expression equality-expression == relational- ...
- ISO/IEC 9899:2011 条款6.5.5——乘法操作符
6.5.5 乘法操作符 语法 1.multiplicative-expression: cast-expression multiplicative-expression * cast-e ...
- ISO/IEC 9899:2011 条款6.5.4——投射操作符
6.5.4 投射操作符 语法 1.cast-expression: unary-expression ( type-name ) cast-expression 约束 2.除非类型名 ...
- ISO/IEC 9899:2011 条款6.5.2——后缀操作符
6.5.2 后缀操作符 语法 1.postfix-expression: primary-expression postfix-expression [ expression ] p ...
- ISO/IEC 9899:2011 条款3——术语、定义与符号
3. 术语.定义与符号 1.对于此国际标准的意图,应用了以下定义.其它术语是在用斜体类型或一个语法规则左侧出现的地方定义.在本国际标准中所显式定义的术语不被假定为对其它地方所定义的类似术语的隐式引用. ...
- ISO/IEC 9899:2011 条款5——5.2.1 字符集
5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...
随机推荐
- java在win系统下的环境的搭建
学习Java第一步是配置本地开发环境,学习最基本的桌面开发,下面以win7为例配置Java开发环境,安装JDK的时候会默认安装JRE,根据提示安装就可以了. 首先去官网下载适合系统版本的JDK,下载地 ...
- MQ的常见应用场景
MQ的常见的应用场景为:解耦,异步,流量削峰 在解耦场景中: 不使用MQ的耦合场景: 使用解耦的场景为: 异步的方式: 不使用MQ的同步高延时请求场景: 使用异步化之后的接口性能优化: 没有使用mq的 ...
- 《你们都是魔鬼吗》团队作业Beta冲刺---第一天
团队作业Beta冲刺 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 你们都是魔鬼吗 作业学习目标 (1)掌握软件黑盒测试技术:(2)学会编制软件 ...
- axios 的 get 方法 params 传参 400 的问题
axios 的 get 方法 params 传参,在输入框中输入某些特殊字符 例如中括号,请求时会直接报 400 错误,Bad Request. 原因:axios 的 get 方法,在使用 param ...
- oracle 查询表重复数据 并 删除保留一条
语法:select count(字段名),字段名 from 表名 group by 字段名 having count(字段名)>1 实例: select count(name),name ...
- LightOJ - 1102 - Problem Makes Problem(组合数)
链接: https://vjudge.net/problem/LightOJ-1102 题意: As I am fond of making easier problems, I discovered ...
- 学习Spring-Data-Jpa(七)---JpaRepository
之前我们学习的Repository都是Spring-Data为了兼容NoSQL而进行的一些抽象封装,从JpaRepository开始是对关系型数据库进行抽象封装.JpaRepository位于spri ...
- 014——C#新建文件夹
(一)如果不存在路径就新建文件夹 string directory = @"C:\Users\Administrator\Desktop\温控数据\"; if (!Director ...
- BurpSuite Intruder模块匹配返回包内容
很多时候burpsuite intruder爆破我们是看返回包的长度,那么如何根据返回包的内容来做筛选呢? 这里我用的本地某cms环境做个演示 Intruder模块怎么用的不用介绍了吧 直接进入正题 ...
- Acwing P298 围栏
Analysis ①首先将所有粉刷匠,按照必须刷的小木块Si从小到大排序. 上面这个操作为了保证我们可以顺序处理. ②我们可以设f[i][j]表示为,前i个粉刷匠,刷了前i个木块.可以有些木块选择不刷 ...