为什么这不会给出编译错误

时间:2017-09-23 16:20:17

标签: c

#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值错误。

2 个答案:

答案 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放在该位置,则会出现错误。