【问题标题】:Why "#define EOF (-1)" and not just "#define EOF -1"为什么“#define EOF (-1)”而不仅仅是“#define EOF -1”
【发布时间】:2016-05-21 06:38:22
【问题描述】:

我正在使用 Visual Studio 2015 学习一些基本的 C。在尝试 EOF 符号常量时,我​​决定查找它的定义,这就是我发现的:

#define EOF (-1)

虽然 -1 被括在括号中有点奇怪,所以我决定创建自己的 -1 符号常量,所以我做了以下操作:

#define ABC -1

在调试器中,EOF 和 ABC 都显示为值 -1,所以我开始想,为什么 EOF 定义使用 (-1) 来表示 -1 而似乎不需要括号?

谢谢。

【问题讨论】:

  • int i = 0, j; j = i-ABC.
  • @Olaf 很有趣,我永远不会想到它,因为i-ABC 是我不可能写的,我会写i - ABC 这样问题就不会发生,但是你真的很好给出了这个例子,因为它清楚地证明了括号是正确的。
  • @iharob:当然,我也会使用空格。但只要看看这里显示的代码......
  • @Olaf 有趣的是 gcc (Cygwin C Compiler 4.9.3 -std=c1x) 编译 #define ABC -1 int i = 0, j; j = i-ABC 就像 #define ABC (-1)。也许不是所有的编译器都这么表现。

标签: c


【解决方案1】:

如果没有必要,将必要数量的括号添加到已定义的宏中总是很有帮助的。

例如,如果你这样做

#define SUM(a,b) a + b
#define MUL(a,b) a * b

int a = MUL(4+5, 2+3); // you get 4+5*2+3 = 17 instead of 45.
int b = 4 * SUM(1,1); // you get 4*1+1 = 5 instead of 8.

所以你最好写

#define SUM(a,b) ((a) + (b))
#define MUL(a,b) ((a) * (b))

因为这是一个好习惯,所以请始终在宏中使用()

另一个很好的理由是您问题的 cmets 中显示的示例。

【讨论】:

  • 我会说几乎没有必要总是有帮助。这很奇怪,但我今天看到了 3 个与这个问题相关的问题
猜你喜欢
  • 2020-06-28
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
相关资源
最近更新 更多