[英]C++ pre-increment vs post-increment on char* pointer while assigning a value
[英]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。
这是ideone链接。
*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)。
通常,理解此类问题的关键是了解运算符的优先级和关联性,并结合仔细阅读代码来应用该知识。 在此特定情况下,陷阱是步骤3,其中仅取消引用ptr
,而不增加ptr
。
printf("%d ", *ptr); //*ptr evaluated to 2, print 2
实际上,您指向的是数组的第二个值,该值的值为1,直到在上一行中将其增加为止
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.