2015-07-11 46 views
0

为什么输出是“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); 
} 
+8

每行之后都会打印语句。学习调试你自己的代码=) – Mox

回答

4

一个直接的问题。表达

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; 
} 
+0

...并且由于它很可能被编译器内联,所产生的代码甚至可能几乎相同。 –

3
#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的替换。

相关问题