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

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

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

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

注意:这是嵌入式问题

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

你应该自己尝试一下。

该宏将扩展为:

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

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

*p++当宏扩展到*p++ <= b ? *p++ : b *p++被评估两次*p++ <= b ? *p++ : b *p++ <= b ? *p++ : b

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

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

宏将扩展为

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

ie least =((1)<=(2)?(* p ++):( b));

因为* p递增两次。

1)* p ++ – >现在p将指向地址0xfcf4;

2)* p ++ – >现在p将指向地址0xfcf8;

至少= 15; (地址0xfcf8中的值)。 希望能帮助到你。