c - 代码执行的结果会是什么? C 运算符优先级

标签 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;)
    {
        *pi++ = 0;
        *pi *= 2;
    }

    for(int i=0; i<10; i++)
        printf("%d ", tab[i]);

    return 0;
}

最佳答案

第一件事是for循环确实是点 pitab ,即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/

相关文章:

c - 标准 C 库是否有好的手册?

c# - C#'s operators' 操作顺序

CSS 组合子优先级

c - 这个c代码仍然不是定义的输出吗?

c - 不使用 for 循环打印矩阵

c++ - + 和++ 的运算符优先级

Scala:可以在不带括号的表达式中使用 "foo match { bar }"吗?

javascript - JavaScript 中 a = b == c 的优先顺序是什么?

c - 我试图让这个程序询问书名和编号,但 while 循环有些不对劲

c - 定义我自己的 malloc 后出现段错误?