7.11牛客题(赋值+运算符优先级)

时间:2022-09-21 13:59:25
对以下程序,正确的输出结果是(D) <stdio.h>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#define SUB(x,y) x-y
#define ACCESS_BEFORE(element,offset,value) *SUB(&element, offset) = value
int main() {
     int array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
     int i;
     ACCESS_BEFORE(array[5], 4, 6);
     printf ( "array: " );
     for (i = 0; i < 10; ++i) {
         printf ( "%d" , array[i]);
     }
     printf ( "\n" );
     return (0);
}
</stdio.h>
A array: 1 6 3 4 5 6 7 8 9 10
B array: 6 2 3 4 5 6 7 8 9 10
C 程序可以正确编译连接,但是运行时会崩溃
D 程序语法错误,编译不成功


分析:
本题主要是考察宏定义的替换,宏替换在预编译阶段进行,不进行语法的检查,当进行替换时,ACCESS_BEFORE(array[5],4,6)被替换成*(&array[5])-4=6 显然这是不正确的,
在赋值表达式中,左值必须是一个可修改的内存块,而上述式子的左值是一个字面值常量,这是编译不能通过的。
运算符优先级参考博客:https://blog.csdn.net/yesyes120/article/details/79514516