为什么输出是“0 -6”而不是“4 60”?不是k = 8,l = 2?为什么分析代码是不正确的?
#define MAC(a,b) (a<b ? a*b:a-b)
void main (void)
{
int i=2;
int j=4;
int k=MAC(i,j);
int l=MAC(j,i);
i=MAC(k+l,k-l);
j=MAC(k-l,k+l);
printf("%d %d\n", i,j);
}
为什么输出是“0 -6”而不是“4 60”?不是k = 8,l = 2?为什么分析代码是不正确的?
#define MAC(a,b) (a<b ? a*b:a-b)
void main (void)
{
int i=2;
int j=4;
int k=MAC(i,j);
int l=MAC(j,i);
i=MAC(k+l,k-l);
j=MAC(k-l,k+l);
printf("%d %d\n", i,j);
}
一个直接的问题。表达
MAC(k+l,k-l)
成为
(k+l<k-l ? k+l*k-l:k+l-k-l)
^^^^^^^
,正如你可以从下划线位看,表达的是不是你认为这是由于优先规则(乘法加法之前完成)。
这可以通过确保在宏每个参数是固定的parenthesised:
#define MAC(a,b) ((a)<(b) ? (a)*(b):(a)-(b))
但如果你像n++
传递,因为它会递增多次仍然不会有所帮助。
宏是非常简单的文本替换,并且众所周知会导致问题,如您所看到的。我的建议是把MAC
为适当的功能,将完全避免这个问题,是这样的:
int mac (int a, int b) {
if (a < b)
return a * b;
return a - b;
}
...并且由于它很可能被编译器内联,所产生的代码甚至可能几乎相同。 –
#define MAC(a,b) (a<b ? a*b:a-b)
void main (void)
{
int i=2;
int j=4;
int k= i<j ? i*j:i-j;
int l= j<i ? j*i:j-i;
i= k+l<k-l ? k+l*k-l:k+l-k-l;
j= k-l<k+l ? k-l*k+l:k-l-k+l;
printf("%d %d\n", i,j);
}
这是你的代码得到预处理后所制作。预编译宏在编译之前发生。与编译不同,不存在已发生变量的符号链接,但仅定义1到1的替换。
每行之后都会打印语句。学习调试你自己的代码=) – Mox