指针的后缀一元递增操作
Postfix unary increment operation on pointers
我最近开始使用 C 和 Pointers。关于指针的一元增量操作,有一个概念让我感到困惑。
int num1, *pnum1
num1 = 2;
pnum1 = &num1;
printf("%d \n before: " , *pnum1);
num1 = (*pnum1)++;
printf("%d \n after: " , *pnum1);
return 0;
因为 一元增量运算符 (++) 比 取消引用具有更高的优先级operator (*),我把 *pnum1 放在大括号内。我期望看到以下结果:
after: 3
但它不会增加 num1 的值。为什么会这样?不是应该增加 num1 的值吗?
这是未定义的行为。您递增 num1
(通过 (*pnum1)++
),然后将结果分配回 num1
。在这种情况下,递增和赋值发生的顺序是未定义的,因此它可以获取 num1
的旧值,递增 num1
,然后将旧值赋值回 num1
,这似乎成为您的编译器选择执行的操作。
如果您尝试 num1 = num1++
,您的编译器可能会警告您。
解决方案是不要做这样的事情,因为它是未定义的行为。
查找 "sequence points" 了解更多信息。
我最近开始使用 C 和 Pointers。关于指针的一元增量操作,有一个概念让我感到困惑。
int num1, *pnum1
num1 = 2;
pnum1 = &num1;
printf("%d \n before: " , *pnum1);
num1 = (*pnum1)++;
printf("%d \n after: " , *pnum1);
return 0;
因为 一元增量运算符 (++) 比 取消引用具有更高的优先级operator (*),我把 *pnum1 放在大括号内。我期望看到以下结果:
after: 3
但它不会增加 num1 的值。为什么会这样?不是应该增加 num1 的值吗?
这是未定义的行为。您递增 num1
(通过 (*pnum1)++
),然后将结果分配回 num1
。在这种情况下,递增和赋值发生的顺序是未定义的,因此它可以获取 num1
的旧值,递增 num1
,然后将旧值赋值回 num1
,这似乎成为您的编译器选择执行的操作。
如果您尝试 num1 = num1++
,您的编译器可能会警告您。
解决方案是不要做这样的事情,因为它是未定义的行为。
查找 "sequence points" 了解更多信息。