为什么这不给编译错误
#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值误差。
请记住,否定实际上是一个算术运算符,而不是作为数字属性存在的东西。
这意味着--5
在这种情况下实际上等于-(-(5))
。也就是说,第一个5
被否定为-5
,那么否定回5
。
至于第二个宏,那么您在宏中使用的“参数”会逐字替换为宏扩展,导致您尝试对常量整数文字执行递增运算符。
我试图找到该规范的第一个宏的行为的参考,但它本质上扩展到- -5
。插入的空间是它不被视为递减运算符的原因。
它是不是preDecrement?( - x)...你会告诉第二个代码它是后增量(i ++),它给了l-Value所需的错误的原因 – Geeta
请读了这本书。有什么时候可以使用++运算符进行说明 –
其原因与宏扩展的方式有关。如果你只是通过预处理器运行第一段代码,你会得到这样的:
int main()
{
printf("The value of A is %d\n", - -5);
return 0;
}
每两个-
符号隔开,所以你实际上得到两个不同的一元-
运营商,而不是运营商预递减的--
。如果你已经把--5
放在那个地方,你会得到一个错误。
谢谢了! – Geeta
需要C书。关于算术表达式的第一章。一般数学加减负数。我们不是在这里教基本知识 –
我投票结束这个问题作为题外话,因为OP只需要学习基本的东西 –
该宏不工作,因为这是行不通的原因:'int main( ){0 ++;返回0; }' –