c - 指针的后缀一元递增操作

标签 c pointers operator-precedence

我刚开始使用 CPointers。关于指针的一元递增操作,有一个概念让我感到困惑。

int num1, *pnum1
num1 = 2;
pnum1 = &num1;
printf("%d \n before: " , *pnum1);
num1 = (*pnum1)++;
printf("%d \n after: " , *pnum1);
return 0;

因为一元递增运算符 (++) 比取消引用运算符 (*) ,我将 *pnum1 放在大括号内。我期望看到以下结果:

after: 3

但它不会增加 num1 的值。为什么会这样?不是应该增加 num1 的值吗?

最佳答案

这是未定义的行为。您递增 num1(通过 (*pnum1)++),然后将结果分配回 num1。在这种情况下,递增和赋值发生的顺序是未定义的,因此它可以获取 num1 的旧值,递增 num1,然后将旧值赋回给 num1,这似乎是您的编译器选择执行的操作。

如果您改为尝试 num1 = num1++,您的编译器可能会警告您。

解决方案是不要做这样的事情,因为它是未定义的行为。

查找“序列点”以获取更多信息。

关于c - 指针的后缀一元递增操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55225928/

相关文章:

c - c 对角线差

c - C 中的堆头和 free()

c - 限制 C 中寄存器的使用

c++ - 为什么我的 removestring 函数有错误

c++ - 如何在堆栈上分配指向指针的指针以及如何在堆上分配指针?

c++ - 在什么平台上 func(shared_ptr(...), shared_ptr(...)) 真的很危险?

python - Python 3 中列表操作从左到右的应用

java 运算符优先级 y = --x + x++;

c - 如何知道传递给函数的 char 数组的大小(以字节为单位)?

c++ - int[n][n] 和 int** 的关系