c - C 中算术指针后增量输出背后的解释

标签 c pointers dereference operator-precedence post-increment

void x(){

     int x[] = {9, 8, 7, 6, 5, 4, 3, 2, 1}; 
     int *p = x + 1;

         while (*p++ >5)
         printf ("%d ", *p); 
         printf ("\n");

}

输出:{7,6,5}

考虑到 C 中的优先级和关联性,我想仔细检查正确输出背后的基本原理。

当调用该函数时,它会自上而下执行,不带任何参数。

首先我们有一个包含 9 个元素的数组 x。

其次我们有一个指针p,它指向元素x[1];

第三,我们跳入 while 循环,每次 *p++ > 5 时都是如此。 这里首先评估的是 p++ 的地址递增,因此对于第一个元素 x[1],我们的值为 8,大于 5,因此 p 递增 (p++ = x[2] = 7) x [2] = 7 成为新的 *p 值(因为它现在指向 x[2])并且打印 7。

接下来我们有 7,它大于 5,p 递增 (p++ = x[3] = 6),因此打印 6,然后我们有 6,它仍然大于 5,p 递增 (p++ = x[ 4] = 5) 因此打印了 5,到目前为止我们已经打印了 {7, 6, 5}。

然后我们评估 x[4] 的位置为 5,不大于 5,因此我们跳出 while 循环并最终得到输出。 {7,6,5}。

我对这个问题的推理正确吗?

最佳答案

Is my reasoning for this question correct?

自行以来

 while (*p++ >5)
     printf ("%d ", *p);

更简单的形式相当于

 while (*p >5)
 {
     p = p + 1;           // Or: p++; Or: ++p;
     printf ("%d ", *p);

 }

然后是的,你的推理是正确的

如果您处于初级水平,我建议您避免在复杂表达式中使用前增量 (++x) 和后增量 (x++)。它们是造成许多初学者错误的原因。仅将它们用作单个表达式。保持事情简单,可以避免许多错误。

关于c - C 中算术指针后增量输出背后的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49484080/

相关文章:

c - 使用read函数使用C读取大文件(大于4GB),导致问题

PHP 解引用数组元素

c - 为什么对于指针 *p,p[0] 是存储在 p 的地址而 p[1] 是 p 本身的地址?

c - 检测客户端 ctrl-c 套接字

c - 指向#define 的指针

c - 尝试将模块加载到内核时出错

c++ - 在 qsort 之后识别项目/类指针

c++ - 指针只保存指向其他变量的地址吗?

c - 如何在c中读取文本文件,然后将每一行分割成标记?

c - 这些C指针操作会不会出问题?