对以下程序,正确的输出结果是()
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);
}
|
正确答案: D 你的答案: A (错误)
array: 1 6 3 4 5 6 7 8 9 10
array: 6 2 3 4 5 6 7 8 9 10
程序可以正确编译连接,但是运行时会崩溃
程序语法错误,编译不成功
这道题大家走出考场后争议非常大。咱啥也不说,直接进mingw跑一下gcc:
gcc提示的错误是“赋值号的左边操作数需要一个左值”。其原因是调用宏的那句被预处理器替换成了:
*&array[5]-4 =6;
由于减号比赋值优先级高,因此先处理减号;由于减号返回一个数而不是合法的左值,所以编译报错。

gcc提示的错误是“赋值号的左边操作数需要一个左值”。其原因是调用宏的那句被预处理器替换成了:
*&array[5]-4 =6;
由于减号比赋值优先级高,因此先处理减号;由于减号返回一个数而不是合法的左值,所以编译报错。
发表于 2014-10-25 00:26:13