涉及 pre/post 增量和指针的 C 程序的输出
Output of C program involving pre/post increment and pointer
我正在解决猜测以下 C 代码的输出 测验,但我没有得到以下一个的输出:
(在 printf
之后的评论中,我写了我认为该行已执行的执行顺序以及让我感到困惑的地方)
int i;
int *ptr = (int *) malloc(5 * sizeof(int));
int *ptr2 = ptr;
int *ptr3 = ptr;
for (i=0; i<5; i++)
{
*(ptr + i) = i;
}
printf("%d ", *ptr++); //*ptr evaluated to 0, print 0, increment ptr
printf("%d ", (*ptr)++); //*ptr evaluated to 1, print 1, increment ptr
printf("%d ", *ptr); //*ptr evaluated to 2, print 2
printf("%d ", *++ptr); //increment ptr, *ptr evaluated to 3, print 3 (but in actual it prints 2, why?)
printf("%d ", ++*ptr); //*ptr evaluated to 3, increment 3, print 4 (but in actual it prints 3, why?)
输出
0 1 2 2 3
为什么最后两个整数 2 和 3?我觉得他们应该是3和4。
Here 是 ideone link.
printf("%d ", *ptr); //*ptr evaluated to 2, print 2
您实际上是在指向数组的第二个值,它的值为 1,直到您在上一行增加它
*ptr++
递增 ptr
然后取消引用 ptr
的先前值,产生 ptr[0]
(0).
(*ptr)++
取消引用 ptr
然后增加存储在那里的值,产生 ptr[1]
(1)(但保留为 2)。
*ptr
取消引用指针,产生 ptr[1]
(2) 因为我们还没有继续前进。
*++ptr
递增 ptr
并取消引用 ptr
的新值,产生 ptr[2]
(2).
++*ptr
取消引用 ptr
并增加存储的值,产生 ptr[2]
(3)。
一般来说,理解此类问题的关键是了解 operator precedence and associativity 并将这些知识与 仔细 阅读代码相结合。在这种特定情况下,陷阱是第 3 步,其中 ptr
仅被取消引用而不是递增。
我正在解决猜测以下 C 代码的输出 测验,但我没有得到以下一个的输出:
(在 printf
之后的评论中,我写了我认为该行已执行的执行顺序以及让我感到困惑的地方)
int i;
int *ptr = (int *) malloc(5 * sizeof(int));
int *ptr2 = ptr;
int *ptr3 = ptr;
for (i=0; i<5; i++)
{
*(ptr + i) = i;
}
printf("%d ", *ptr++); //*ptr evaluated to 0, print 0, increment ptr
printf("%d ", (*ptr)++); //*ptr evaluated to 1, print 1, increment ptr
printf("%d ", *ptr); //*ptr evaluated to 2, print 2
printf("%d ", *++ptr); //increment ptr, *ptr evaluated to 3, print 3 (but in actual it prints 2, why?)
printf("%d ", ++*ptr); //*ptr evaluated to 3, increment 3, print 4 (but in actual it prints 3, why?)
输出
0 1 2 2 3
为什么最后两个整数 2 和 3?我觉得他们应该是3和4。
Here 是 ideone link.
printf("%d ", *ptr); //*ptr evaluated to 2, print 2
您实际上是在指向数组的第二个值,它的值为 1,直到您在上一行增加它
*ptr++
递增 ptr
然后取消引用 ptr
的先前值,产生 ptr[0]
(0).
(*ptr)++
取消引用 ptr
然后增加存储在那里的值,产生 ptr[1]
(1)(但保留为 2)。
*ptr
取消引用指针,产生 ptr[1]
(2) 因为我们还没有继续前进。
*++ptr
递增 ptr
并取消引用 ptr
的新值,产生 ptr[2]
(2).
++*ptr
取消引用 ptr
并增加存储的值,产生 ptr[2]
(3)。
一般来说,理解此类问题的关键是了解 operator precedence and associativity 并将这些知识与 仔细 阅读代码相结合。在这种特定情况下,陷阱是第 3 步,其中 ptr
仅被取消引用而不是递增。