#define ROW 5
#define COL 5
int main()
{
int array[ROW][COL]
int i, j, sum = 0, count = 0
float average = 0.0
// 初始化二维数组
for (i = 0i <ROWi++)
{
for (j = 0j <COLj++)
{
array[i][j] = i + j
}
}
// 计算二维数组的和
for (i = 0i <ROWi++)
{
for (j = 0j <COLj++)
{
sum += array[i][j]
}
}
// 计算周围元素的平均值
for (i = 0i <ROWi++)
{
for (j = 0j <COLj++)
{
if (i >0 &&j >0 &&i <ROW - 1 &&j <COL - 1)
{
count++
average += (array[i-1][j-1] + array[i-1][j] + array[i-1][j+1] + array[i][j-1] + array[i][j+1] + array[i+1][j-1] + array[i+1][j] + array[i+1][j+1]) / 8.0
}
}
}
// 打印结果
printf("The sum of the array is %d\n", sum)
printf("The average of the surrounding elements is %.2f\n", average / count)
return 0
}
该代码使用两个嵌套循环遍历整个二维数组,第一个循环用于计算数组的和,第二个循环用于计算周围元素的平均值。除了数组的边界元素外,所有元素的周围元素都将被计算入平均值。
请注意,代码中使用了 ROW 和 COL 宏定义,这些定义用于指定数组的行数和列数,因此,如果您希望使用其他数组大小,只需修改这些定义即可。
最后,代码使用 printf 函数打印结果,并使用了格式字符串(.2f)以保留两位小数。
优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。表达式的结合次序取决于表达式中各种运算符的优先级。优先级高的运算符先结合,优先级低的运算符后结合,同一行中的运算符的优先级相同。
优先级与求值顺序无关。如a+b &&b*c,虽然*优先级最高,但这个表达式求值顺序是从左到右。
优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。
相同优先级中,按结合性进行结合。大多数运算符结合性是从左到右,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。
序列点
序列点是程序执行中的一个点,在这个点之前,前面的表达式的求值和副作用已经完成,而后面表达式的求值和副作用还没有发生。C 标准定义以下序列点:
(1)运算符&&;运算符||;逗号运算符,;条件运算符?:的第一个子表达式求值结束后。
(2)函数调用运算符()中对所有实参数完成求值之后。
(3)每个完整表达式结束时。完整表达式包括变量初始化表达式,表达式语句的表达式,return 语句的表达式,if 或 switch 语句中的控制表达式,while 或 do语句的控制表达式,for 语句的所有三个表达式。
(4)标准库函数返回之前,标准输入输出函数格式化转换说明符关联动作之后,标准查找函数和排序函数在调用比较函数之前和之后及参数传递之后。
由序列点的定义可知,与运算符&&;或运算符||;逗号运算符,;条件运算符?:等 4 个运算符的左操作数属于前一个序列点,右操作数属于后一个序列点,因此,这 4 个运算符的左操作数的求值要先于右操作数完成。