我知道一元运算符 ++ 对数字加一。然而,我发现如果我对 int 指针执行此操作,它会增加 4(我系统上 int 的大小)。为什么要这样做?例如,以下代码:
int main(void)
{
int *a = malloc(5 * sizeof(int));
a[0] = 42;
a[1] = 42;
a[2] = 42;
a[3] = 42;
a[4] = 42;
printf("%p\n", a);
printf("%p\n", ++a);
printf("%p\n", ++a);
return 0;
}
将返回三个数字,每个数字之间相差 4。
这就是 C 的方式 - 完整的解释在规范中,第 6.5.6 节 加法运算符,第 8 段:
当具有整数类型的表达式与指针相加或相减时,结果具有指针操作数的类型。如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向距原始元素的元素偏移量,使得结果数组元素和原始数组元素的下标之差等于整数表达式。换句话说,如果表达式P
指向i- 数组对象的第一个元素,表达式(P)+N
(相当于,N+(P)
) and (P)-N
(where N
有价值n)分别指向i+n 个并且i− 数组对象的第 n 个元素(前提是它们存在)。此外,如果表达式P
指向数组对象的最后一个元素,表达式(P)+1
指向数组对象的最后一个元素,并且如果表达式Q
指向数组对象的最后一个元素,表达式(Q)-1
指向数组对象的最后一个元素。如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则求值不会产生溢出;否则,行为是未定义的。如果结果指向数组对象的最后一个元素,则不得将其用作一元的操作数*
被评估的运算符。
将其与您对前缀的使用联系起来++
运算符,您还需要阅读第 6.5.3.1 节 前缀递增和递减运算符,第 2 段:
前缀操作数的值++
运算符递增。结果是操作数自增后的新值。表达方式++E
相当于(E+=1)
.
并且第 6.5.16.2 节 复合赋值,第 3 段:
A 复合赋值形式的E1
op= E2
与简单的赋值表达式不同E1 = E1
op (E2)
仅在于左值E1
仅评估一次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)