这个问题在这里已有答案:
我有以下代码:
#include <stdio.h>
#include <stdlib.h>
#define CVAL(p) (*(p++))
int main()
{
int code[4] = {2, 100, 200};
int nn=0;
printf("code[0] address = %p\n", &code[0]);
printf("nn address = %p\n", &nn);
printf("nn content= %i\n\n", nn);
int *pt = &code[0];
nn = CVAL(pt); /*<-- line 18!*/
printf("nn address = %p\n", &nn);
printf("nn content = %i\n\n", nn);
printf("\n");
return 0;
}
你的输出是:
code[0] address = 0028FF2C
nn address = 0028FF28
nn content= 0
nn2 address = 0028FF28
nn2 content = 2
但是当我改变表达式并将其分开时(第18行和第19行),nn2的结果发生了变化!在2之前,现在它是100.为什么?
...
pt++;/*<-- line 18!*/
nn = *pt;/*<-- line 19*/
...
输出:
code[0] address = 0028FF2C
nn address = 0028FF28
nn content= 0
nn2 address = 0028FF28
nn2 content = 100
在第一种情况下,您的代码如下所示
int code[4] = {2, 100, 200};
int nn=0;
int *pt = &code[0];
nn = (*(pt++)); /* post increments on pointer i.e first assign then increment */
宏替换完成后由预处理器完成。所以在这里
nn = (*(pt++));
第一个pt++
解决了后增量,即pt
指向数组code
的基地址仍然和去引用将2
分配给nn
所以它打印2
。
在第二种情况下
pt++;/* here pt points to same address but in next statement it will points to incremented address */
nn = *pt; /* here pt pointing to code[1] address */
在nn = *pt
执行时,pt
指向code[1]
地址因此nn
被分配100
。
通过分析以下两个场景,您可以轻松了解上面发生的事情。
情况1 :-
int var1 = 10, var2;
var2 = var1++; /* in this statement var2 gets assigned with 10, not incremented one as this is post increment */
printf("%d\n",var2);
案例2: -
int var1 = 10, var2;
var1++;
var2 = var1; /* now here incremented var1 gets assigned to var2 */
printf("%d\n",var2);
当你有
nn = CVAL(pt); /*<-- line 18!*/
随着宏扩大了
nn = *pt++;
并且由于后缀增量在使用旧值后执行增量,因此它等效于
nn = *pt;
pt += 1;
这与您的第二个版本完全不同,后者以相反的顺序执行取消引用和增量。