6.5.7 加法运算符
加法表达式包括:
E1 + E2E1 - E2
对于加法:
- 要么两个操作数都具有算术类型;
- 要么一个是“指向完整对象类型的指针”,另一个是整数类型。
对于减法:
- 要么两个操作数都具有算术类型;
- 要么两个操作数都是指向兼容完整对象类型的指针;
- 要么左操作数是“指向完整对象类型的指针”,右操作数是整数类型。
若任一操作数为十进制浮点类型,则另一操作数不得是标准浮点类型、复数类型或虚数类型。
两个算术类型相加减时,先执行通常算术转换。
+的结果是和,-的结果是差。
指针与整数
在这些运算中,一个“并非数组元素的对象指针”应按“指向长度为 1 的数组首元素的指针”来处理。
指针与整数相加减时,结果类型仍是该指针类型。
若指针原本指向数组对象中的第
i个元素,则:P + n指向第i + n个元素;P - n指向第i - n个元素;
前提是这些位置存在于同一个数组对象中,或者刚好是其尾后位置。
指向最后一个元素的指针再加
1,可以形成尾后指针;尾后指针减1又回到最后一个元素。若结果指针没有指向同一数组对象中的元素,也没有指向其尾后位置,则行为未定义。
若加减过程中产生溢出,行为未定义。
尾后指针不能作为被求值的一元
*操作数使用。
指针与指针相减
两个指针相减时,它们都必须指向同一数组对象中的元素,或其中一个刚好指向尾后位置。
结果是两个下标之差,其类型是
ptrdiff_t。若该差值不能由
ptrdiff_t表示,则行为未定义。
标准示例
c
{
int n = 4, m = 3;
int a[n][m];
int (*p)[m] = a; // p == &a[0]
p += 1; // p == &a[1]
(*p)[2] = 99; // a[1][2] == 99
n = p - a; // n == 1
}1
2
3
4
5
6
7
8
2
3
4
5
6
7
8