减号的优先级http://www.nowcoder.com/profile/380772/test/2198787/873#summary

本文通过一个具体的C语言程序示例,详细解析了宏定义在实际编程中的应用及可能遇到的问题。特别是针对宏ACCESS_BEFORE的使用进行了深入探讨,并指出在特定情况下可能导致的编译错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对以下程序,正确的输出结果是()
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; 
由于减号比赋值优先级高,因此先处理减号;由于减号返回一个数而不是合法的左值,所以编译报错。
发表于 2014-10-25 00:26:13

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值