Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
代码执行的结果是什么?C运算符优先级_C_Operator Precedence - Fatal编程技术网

代码执行的结果是什么?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您还希望看到什么以及为什么?您希望看到什么输出,以及为什么?