首页 > 试题广场 >

有以下程序,程序的输出结果是?

[单选题]

若有以下程序

#include <stdio.h>
#define N 2
#define M N + 1
#define NUM (M + 1) * M / 2
main() { printf("%d\n", NUM); }


程序运行后的输出结果是?

  • 4
  • 8
  • 9
  • 6
推荐
本题考查宏定义,宏定义只是做个简单的替换,执行NUM=(N+1+1)*N+1/2=8,选项B正确。
编辑于 2015-02-03 17:24:12 回复(4)
宏只是字符串替换,并没有计算能力,所以最后的结果是(2+1+1)*2+1/2
发表于 2015-07-07 00:16:29 回复(0)
c语言小数取整是去掉小数部分
发表于 2017-08-03 22:14:54 回复(0)

有如下宏定义:

#define foo (4 + foo) 

按一般的理解,(4 + foo)会展开成(4 + (4 + foo)),然后一直展开下去,直至内存耗尽。但是,预处理器采取的策略是 只展开一次 。也就是说,foo只会展开成(4 + foo),而展开之后foo的含义就要根据上下文来确定了。

对于以下的交叉引用,宏体也只会展开一次。

#define x (4 + y) #define y (2 * x) 

x展开成(4 + y) -> (4 + (2 * x)),y展开成(2 * x) -> (2 * (4 + y))。

注意,这是极不推荐的写法,程序可读性极差。

参考 http://hbprotoss.github.io/posts/cyu-yan-hong-de-te-shu-yong-fa-he-ji-ge-keng.html
发表于 2016-04-22 16:21:23 回复(1)
M替换成N+1时,不带括号,不是(N+1),而是直接的N+1,所以后面是1/2
发表于 2022-07-28 19:49:05 回复(0)
此题口算很容易算错,注意宏只是替换
发表于 2017-03-09 11:35:06 回复(0)
一个问题就是,如果宏定义中存在依赖,处理的过程是怎样的?
发表于 2016-03-05 10:22:28 回复(1)
宏定义就是字符串原样替换,这里是(N+1+1)*N+1/2=(2+1+1)*2+1/2=8.5
发表于 2021-11-12 15:09:15 回复(0)
( 2+1+1 )*2+1/2
发表于 2016-11-30 23:53:02 回复(0)
兄弟们,我宣布个事儿,4 x 2 = 6,我是个烧饼!
发表于 2022-07-08 16:00:56 回复(0)
宏是在预处理阶段进行处理的,经过预处理后,NUM = (N + 1 + 1) * N + 1 / 2,其中 N 等于2。
发表于 2022-03-20 14:51:40 回复(0)
宏替换 将M替换成N+1 所以就成(N+1+1)*N+1\2 
不能自己好心进行计算,或者加()
发表于 2021-09-16 19:48:05 回复(0)

4×2+1/2=8

编辑于 2019-10-08 18:55:09 回复(0)
以后的宏定义要写出来计算 宏定义没有计算的能力,只是把式子写出来
编辑于 2019-10-08 09:55:07 回复(0)
如果将#define M N+1改为#define M (N+1),那么最后的结果是6
发表于 2019-07-09 13:07:30 回复(0)
感觉自己好蠢啊 明明知道替换 但是少算了个1!!!!!!!!!!!!!
发表于 2018-03-18 21:30:18 回复(0)
N+1没有括号,直接替换。
发表于 2017-09-24 02:08:54 回复(0)
宏定义直接替换,2+1+1=4. 4*2=8 8+1=9 9/2=4
发表于 2017-03-18 11:26:58 回复(0)
注意将宏定义表达式直接代入,不能轻易的相加。
发表于 2016-05-21 15:04:30 回复(0)