#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值错误时,请给我一个明确的想法。我很多时候都在寻找一个确切的原因我们何时会得到l值错误。
答案 0 :(得分:1)
请记住,否定实际上是一个算术运算符,而不是作为数字属性存在的东西。
这意味着在这种情况下class Stack{
int min;
Node top;
static class Node{
private int data;
private Node next;
private int min;
Node(int data, int min){
this.data = data;
this.min = min;
this.next = null;
}
}
void push(int data){
Node temp;
if(top == null){
temp = new Node(data,data);
top = temp;
top.min = data;
}
if(top.min > data){
temp = new Node(data,data);
temp.next = top;
top = temp;
} else {
temp = new Node(data, top.min);
temp.next = top;
top = temp;
}
}
void pop(){
if(top != null){
top = top.next;
}
}
int min(){
return top.min;
}
实际上等于--5
。也就是说,首先-(-(5))
被否定为5
,然后被否定回-5
。
对于第二个宏,那么在宏中使用的“参数”将逐字替换为宏扩展,从而导致您尝试在常量整数文字上执行增量运算符。
我正在尝试查找对第一个宏行为的规范的引用,但它实质上扩展为5
。插入的空格是不被视为减量运算符的原因。
答案 1 :(得分:0)
其原因与宏的扩展方式有关。如果你只通过预处理器运行第一段代码,你就会得到这个:
int main()
{
printf("The value of A is %d\n", - -5);
return 0;
}
两个-
符号中的每一个都是分开的,因此您实际上会获得两个单独的一元-
运算符,而不是预先生成的运算符--
。如果您已将--5
放在该位置,则会出现错误。