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.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...
随机推荐
- [转]LINUX最大线程数及最大进程数
原文:https://blog.csdn.net/wowocpp/article/details/86673886 --------------------- cat /proc/sys/kernel ...
- P1801 黑匣子[堆]
题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ...
- 如何通过cmd获取到域名下的ip地址?例如获取百度的域名
百度首页的IP地址为[119.75.217.109] 你可以通过电脑本机进行查询,查询步骤如下: 1.点击[开始]--->>[运行],输入[cmd]: 按键盘上的[Win键]+[R键],调 ...
- 用python实现多线程爬取影视网站全部视频方法【笔记】
我拿这个站点作为案例:https://91mjw.com/ 其他站点方法都是差不多的. 第一步:获得整站所有的视频连接 html = requests.get("https://91mjw ...
- JVM对象创建
1.JVM对象创建:java程序运行过程中,无时无刻都有对象被创建出来.在语言层面上就是new关键字. 2.JVM对象创建过程: (1)JVM遇到一条new指令后,首先会去常量池中,检查这个指令的参数 ...
- Django 第一天 开端
今日内容: 一.HTTP协议 1.HTTP协议简介 参考博客:https://www.cnblogs.com/clschao/articles/9230431.html 是超文本传输协议 现在使用最广 ...
- 计算 byte[] 转 int modebus 指定位数 获取值 使用
计算 byte[] 转 int modebus 指定位数 获取值 使用 if (bytetores.Length > 6) { int total = 0; for (int i = 0; i ...
- web大文件分块上传断点续传demo
一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Content- ...
- python与各数据库的交互
from redis import StrictRedis from pymongo import MongoClient import pymysql #redis客户端 redis_cli = S ...
- 开始编写Makefile(二)Makefile变量的使用
Makefile可以使用变量代替 命令行:make -f Makefile2 说明开始make一个名为Makefile2的文件 ###############定义变量################# ...