C中以下宏的副作用是什么?嵌入式C

时间:2011-09-04 12:42:30

标签: c macros

#define MIN(A,B) ((A) <=  (B) ? (A) : (B))

这是宏,我被问到如果我使用以下内容会产生什么副作用:

least = MIN(*p++, b);

注意:这是嵌入式问题

4 个答案:

答案 0 :(得分:7)

它评估p++两次。此外,由于第一次评估会更改p,第二次评估会更改,它会指向不同的元素。因此返回的值为*(initialp + 1)b

你应该自己尝试一下。

答案 1 :(得分:7)

宏将扩展为:

least = ((*p++)<=(b)?(*p++):(b))

您的陈述中将有*p++两次(即,它会增加两次)。

答案 2 :(得分:2)

当宏扩展到*p++

时,

*p++ <= b ? *p++ : b会被评估两次

此外,没有“嵌入式C”这样的东西。

答案 3 :(得分:1)

假设初始地址为p = 0xfcf0,* p = 1,b = 2,值@ 0xfcf4 = 5且值@ 0xfcf8 = 15

宏将扩展为

至少=((* p ++)&lt; =(b)?(* p ++):( b));

即最少=((1)&lt; =(2)?(* p ++):( b));

因为* p递增两次。

1)* p ++ - &gt;现在p将指向地址0xfcf4;

2)* p ++ - &gt;现在p将指向地址0xfcf8;

至少= 15; (地址0xfcf8中的值)。希望它有所帮助。