我在预测下面链接的代码结果时遇到问题。
为什么程序打印 2 0 6 0 10 0 16 0 20 0
?我想这都是关于运算符优先级的,但经过思考一段时间后,我无法意识到我的解释有什么问题。你能解释一下吗?
#include <stdio.h>
int main(void)
{
int tab[10] = {2,4,6,8,10,14,16,18,20};
int *pi, i;
for(pi = tab; ++pi < tab+9;)
{
*pi++ = 0;
*pi *= 2;
}
for(int i=0; i<10; i++)
printf("%d ", tab[i]);
return 0;
}
最佳答案
第一件事是for
循环确实是点 pi
在tab
,即pi=&tab[0]
所以pi
指向数字 2。下一段要执行的代码是 for
循环的“条件”语句++pi < tab+9
。第一个增量 pi
(所以它现在指向 tab[1]
中的数字 4 )并检查它是否仍然指向 tab
的成员早于最后 20 名。
在for
的正文中循环,线路*pi++ = 0;
首先在 pi
指向的地址存储一个 0 (这意味着 tab[1]
现在是 0 而不是 4),然后(后)增量 pi
指向tab[2]
,即 6。然后行 *pi *= 2;
将 pi
指向的值加倍,所以tab[2]
变成 12。
接下来发生的事情是重新评估 for
循环的条件语句(因为它的迭代语句为空):pi
递增并检查。
其余的迭代相当顺利。 tab
的最终状态是第一个成员不变,具有奇数索引的成员为零,其他成员从其初始值增加一倍。
关于运算符和优先级的一般建议:两种情况之一几乎总是如此。首先,您和编译器对于代码中运算符的应用顺序不一致,换句话说,您的代码没有执行您期望的操作。第二个是你完全理解编译器将要做什么,但阅读你的代码的程序员却不明白——换句话说,你的代码没有做他们所期望的事情。幸运的是,这两种情况都可以通过添加括号来消除任何疑问来缓解。
关于c - 代码执行的结果会是什么? C 运算符优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54183822/