操作顺序优先级/循环

时间:2011-04-21 00:33:41

标签: c loops operator-precedence

用C编程语言:

  1. This我不明白。是说(例如)如果+ =是在 - =在一个语句中,+ =首先被评估?或者如果*在a之前,则 - 首先执行?我需要了解优先权。

  2. 有人可以给我写两三个复杂的循环,包括:一些计数器变量,3或4或5个循环,数组,printf和字符串和东西?如果我想参加我的编程课程或明天的考试,我需要学会手动完成纸上循环。

  3. 这是非常的家庭作业,也就是说,没有什么可以交,只是为明天的C考试做准备。

3 个答案:

答案 0 :(得分:4)

优先级图表有垂直组件(优先级)和水平组件(关联性)。

基本上,列表中较高的操作首先完成,因此a + b * c被评估为a + (b * c)。请注意,这并不意味着在b * c之前计算a,只是*操作在+之前完成。实现可以先计算a然后乘以bc,然后将其添加到已计算的a

对于简单的表达式,这没有区别,但如果表达式中的一个术语除了提供简单值之外还有副作用,它就会咬你。通过这种方式,我的意思是像i++那样具有递增i的副作用,或者调用修改全局变量的函数,或者将信息写入数据库。

如果两个运算符具有相同的优先级,则关联性将接管。这决定了如何将相同的优先级组一起操作。

所以+-(从左到右具有相关性)意味着a + b - c的评估结果为(a + b) - c

另一方面,+=-=具有从右到左的关联性,因此a += b -= c的评估结果为a += (b -= c)


就循环而言,您可以从以下内容开始:

#include <stdio.h>
#define WIDTH 5
#define HEIGHT 7
int main (void) {
    int num[WIDTH*HEIGHT];
    int counter = 100;
    for (int i = 0; i < HEIGHT; i++)
        for (int j = 0; j < WIDTH; j++)
            num[i*WIDTH+j] = --counter;
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            printf ("%3d ", num[i*WIDTH+j]);
        }
        printf ("\n");
    }
    return 0;
}

我建议你快速尝试理解它,然后输入它来编译和运行。

答案 1 :(得分:1)

1)“图表中同一行上的运算符具有相同的优先级”,因此a + b - c的计算结果为(a + b) - c。从上到下阅读该页面以获取操作顺序。因此,对于a + b + (c * ++d),订单将添加1到d,将其乘以c,然后将整个数量添加到数量a + b

2)对于循环,只需从正常书籍中读取,从上到下。例如:(伪代码校正为正确的C -zw)

int i, j, k;
for (i = 0; i < 100; i++)
    for (j = 0; j < 10; j++)
        for (k = 10; k > 0; k = k/2)
            printf("%d %d %d\n", k, j, i);

你从i开始为0,j开始为0,i和j保持为0而k为10,5,2,1,然后你再回来,j为1,而我仍为0,k为10,5 ,2,1。重复直到j为10,然后返回并使我1.重复这一整个事情,直到我为100.内部循环运行到完成进程循环的每个值。

答案 2 :(得分:1)

运算符优先级和关联性未指定C计算表达式的 order 。它指定子表达式如何组合在一起。

+=-=具有相同的优先级,并且从右到左关联。这意味着在这个表达式中:

a += b -= c

C将其分组为:

a += (b -= c)

因此从b中减去的值为c,而添加到a的值是表达式b -= c的结果(这是新的值b)。未指定实际发生的顺序。


试试这个嵌套循环 - 它在做什么?

int check(const char *entries[], size_t num_entries)
{
    int i, j;
    int count = 0;

    for (i = 1; i < num_entries; i++)
    {
        size_t ilen = strlen(entries[i]);

        for (j = 0; j < i; j++)
        {
            size_t jlen = strlen(entries[j]);

            if (jlen >= ilen && !memcmp(entries[i], entries[j], ilen))
            {
                count++;
                printf("%s@%d shadows %s@%d.\n", entries[j], j, entries[i], i);
            }
        }
    }

    return count;
}