为什么这不给编译错误

问题描述:

#include<stdio.h> 
#define A -B 
#define B -C 
#define C 5 

int main() 
{ 
    printf("The value of A is %d\n", A); 
    return 0; 
} 

在这,宏只是被取代-B成为--C和最后--5.但这应该给编译错误,因为5是一个常数的权利?但它实际上打印 “A的价值是5” 任何人都可以清楚地解释我什么时候我们会完全得到l值错误?因为下面的代码实际上给出了l值需要的错误。为什么这不给编译错误

#include <stdio.h> 
#define PRINT(i, limit) do \ 
         { \ 
          if (i++ < limit) \ 
          { \ 
           printf("GeeksQuiz\n"); \ 
           continue; \ 
          } \ 
         }while(1) 

int main() 
{ 
    PRINT(0, 3); 
    return 0; 
} 

请给我一个明确的想法时,L值误差occurs.I'm累了多次搜索的确切原因我们什么时候才能得到L值误差。

+1

需要C书。关于算术表达式的第一章。一般数学加减负数。我们不是在这里教基本知识 –

+3

我投票结束这个问题作为题外话,因为OP只需要学习基本的东西 –

+0

该宏不工作,因为这是行不通的原因:'int main( ){0 ++;返回0; }' –

请记住,否定实际上是一个算术运算符,而不是作为数字属性存在的东西。

这意味着--5在这种情况下实际上等于-(-(5))。也就是说,第一个5被否定为-5,那么否定回5

至于第二个宏,那么您在宏中使用的“参数”会逐字替换为宏扩展,导致您尝试对常量整数文字执行递增运算符。


我试图找到该规范的第一个宏的行为的参考,但它本质上扩展到- -5。插入的空间是它不被视为递减运算符的原因。

+0

它是不是preDecrement?( - x)...你会告诉第二个代码它是后增量(i ++),它给了l-Value所需的错误的原因 – Geeta

+0

请读了这本书。有什么时候可以使用++运算符进行说明 –

其原因与宏扩展的方式有关。如果你只是通过预处理器运行第一段代码,你会得到这样的:

int main() 
{ 
    printf("The value of A is %d\n", - -5); 
    return 0; 
} 

每两个-符号隔开,所以你实际上得到两个不同的一元-运营商,而不是运营商预递减的--。如果你已经把--5放在那个地方,你会得到一个错误。

+0

谢谢了! – Geeta