代码执行的结果是什么?C运算符优先级
我对下面链接的代码的预测结果有问题。代码执行的结果是什么?C运算符优先级,c,operator-precedence,C,Operator Precedence,我对下面链接的代码的预测结果有问题。 为什么程序正在打印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;) {
为什么程序正在打印
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;
}
#包括
内部主(空)
{
int tab[10]={2,4,6,8,10,14,16,18,20};
int*pi,i;
对于(pi=tab;++pi 对于(int i=0;i实际输出为2 0 12 0 20 0 32 0 40 0
(如高炉注释所示)
pi
最初确实位于第一个单元格上,但停止条件会增加指针。因此,在循环内部,对于第一条指令,pi
位于tab[1]
中。它首先将该单元格设为0,然后用++递增。在第二行,它将值加倍,因此它将tab[2]加倍
。然后,停止条件再次增加指针,依此类推。循环的的第一件事是在选项卡上指向pi
,即pi=&tab[0]
因此pi
指向数字2。下一段要执行的代码是for
循环的“条件”语句++pi
。这第一个增量是pi
(因此它现在指向选项卡[1]
中的数字4)并检查它是否仍指向选项卡
中早于最后20个的成员
在for
循环的主体中,行*pi++=0;
首先在pi
指向的地址处存储一个0(这意味着tab[1]
现在是0而不是4),然后(post-)递增pi
指向tab[2]
,即6。然后行*pi*=2;
将pi
指向的值加倍,因此选项卡[2]
变为12
接下来发生的事情是重新评估for
循环的条件语句(因为它的迭代语句是空的):pi
递增并检查
其余的迭代相当平淡无奇。tab
的最终状态是第一个成员保持不变,具有奇数索引的成员为零,其他成员的初始值加倍
关于运算符和优先级的一般建议:两种情况中的一种几乎总是这样。第一种情况是,您和编译器对代码中运算符的应用顺序不一致,换句话说,您的代码没有达到预期的效果。第二种情况是,您完全理解编译器将要执行的操作o、 但是,程序员阅读您的代码时并没有做到这一点,换句话说,您的代码并没有达到他们预期的效果。幸运的是,这两种情况都可以通过添加括号来消除任何疑问来缓解。“我不知道我的解释有什么问题”-您的解释是什么?我无法复制您的输出。请在调试器中逐行检查每行代码。@dannyxn您还希望看到什么以及为什么?您希望看到什么输出,以及为什么?