用C编程语言:
This我不明白。是说(例如)如果+ =是在 - =在一个语句中,+ =首先被评估?或者如果*在a之前,则 - 首先执行?我需要了解优先权。
有人可以给我写两三个复杂的循环,包括:一些计数器变量,3或4或5个循环,数组,printf和字符串和东西?如果我想参加我的编程课程或明天的考试,我需要学会手动完成纸上循环。
这是非常的家庭作业,也就是说,没有什么可以交,只是为明天的C考试做准备。
答案 0 :(得分:4)
优先级图表有垂直组件(优先级)和水平组件(关联性)。
基本上,列表中较高的操作首先完成,因此a + b * c
被评估为a + (b * c)
。请注意,这并不意味着在b * c
之前计算a
,只是*
操作在+
之前完成。实现可以先计算a
,然后乘以b
和c
,然后将其添加到已计算的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;
}