【发布时间】:2016-06-14 11:52:56
【问题描述】:
我收到了很多关于此的相互矛盾的答案。但正如我一直理解的那样。
当我们在 C 语言中有一个指针并在后自增语句中使用它时,后自增总是在代码行解析之后发生。
int array[6] = {0,1,2,3,4,5};
int* p = array;
printf("%d", *p++); // This will output 0 then increment pointer to 1
输出:
0
非常简单的东西。现在,在人们告诉我的信息和我自己的经历中,我感到有些不和谐。
// Same code as Before
int array[0] = {0,1,2,3,4,5};
int* p = array;
printf("%d", *(p++)); // Issue with this line
输出:
0
现在,当我运行代码的第二个版本时,结果是它将输出 0 然后增加指针。括号暗示的操作顺序似乎被违反了。但是,该站点上的其他一些答案告诉我,应该发生的正确事情是增量应该在取消引用之前发生。所以我想我的问题是:我的理解正确吗?后增量语句是否总是在行尾执行?
附加信息:
我正在使用 gcc 版本 ubuntu 4.8.4 在 linux mint 上使用 gcc 进行编译
我还在 debian 4.7.2 版本的 gcc 上对此进行了测试
【问题讨论】:
-
括号隐含的运算顺序 -
(和)是括号,不是括号。我认为这就是您从上下文中所指的内容。正确的术语对于良好的沟通至关重要。 -
这真的编译没有错误吗?您的数组初始化不正确,您的注释斜线错误。
-
我已经对帖子进行了明显的更正。我还应该修复数组声明吗?
-
i = *p++等价于i = *p++也等价于(i = *p, p = p + 1, i)
标签: c pointers gcc operator-precedence