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中的值)。 希望能帮助到你。