我正在解决以下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是理想的链接。
答案 0 :(得分:3)
*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
仅被解除引用而不会递增。
答案 1 :(得分:0)
printf("%d ", *ptr); //*ptr evaluated to 2, print 2
你实际上是指向数组的第二个值,它的值为1,直到你在前一行增加它为止