4

谁能解释一下

#define something (54)

意思是?为什么 54 在括号内?

4

7 回答 7

4

#define something (54)告诉 C 预处理器在实际编译代码之前用“(54)”替换任何匹配“something”的文本。

您经常会看到使用( )around a的原因是,在某些情况下,当文本被替换为更大的表达式#define时,它可以防止被替换的文本产生不利或未定义的行为。#defined这种不利影响可能是运算符优先级的变化等。

于 2012-07-17T03:19:27.783 回答
4

将任何#define 语句放在括号内通常是一个好主意。这是一个好习惯,大多数日常程序员都坚持这个好习惯。

例如:

#define TWO_PLUS_ONE    2 + 1

如果我这样使用它:

3 * TWO_PLUS_ONE

我希望看到答案为 9,但是由于运算符优先级,计算出的答案将是 7。您可以找到许多这样的极端情况(请参阅http://www.gimpel.com/html/bugs. .htm)。这就是 C++ 程序员尖叫“宏是邪恶的!”的原因。但我们是 C 程序员,我们是精英,我们并不害怕。

同样的例子:

#define TWO_PLUS_ONE    (2 + 1)

这将在所有情况下给出预期的结果。

大多数程序员都希望他们的实践适用于所有情况,因此它易于记忆、易于实践和易于操作。所以在简单的情况下

#define SOMETHING    (54)

去做就对了。这是个好主意。学会成为团队的一员,他们正在努力帮助你。顺便说一句,接下来他们会说,“应该是(54u)”

于 2012-07-17T03:28:41.340 回答
1

括号是多余的。我无法想象在(54)语义上与54. 现在,如果我错了……给我看;我会学到一些新东西。

于 2012-07-17T03:07:49.813 回答
1

这种情况下的括号将被忽略。和写法一样:

#define something 54

他们只是帮助您喜欢数学,例如:

#define something (54-2)/2

不同于

#define someotherthing 54-2/2
于 2012-07-17T03:07:58.377 回答
1

你为什么要用这个

#define SOMETHING    (54)

而不是这个

const int SOMETHING = 54;

我不确定答案是什么——我认为这种用法#define可能有点过时。也就是说,括号的使用很好,因为它使两种类型的声明的行为方式基本相同。所以现在如果你想调整值......

#define SOMETHING (54+1)

或者

const int SOMETHING = 54+1;

...它们通常仍然等同于“清单常量”。如果没有括号,它们将不等价,因为在计算表达式之前#define使用了简单的替换。

因此,如果#define像这样应用该值...

int a = 2*SOMETHING;

...根据声明中是否使用括号,您会得到不同的结果:

int a = 2*54+1; // no parentheses -- answer is 109
int a = 2*(54+1); // parentheses -- answer is 110

当然,只要分配的值是一个简单的常量,就像在您的示例中一样,括号的存在对编译器没有任何影响。 这只是为了编写此代码或将来可能修改此代码的人的利益。 通过始终如一地应用这种形式的声明,作者试图减少人为错误的发生。

于 2012-10-04T03:13:31.640 回答
0

“()”是括号而不是[括号]。它本质上是一个空操作。任何时候 54 有效,(54) 都有效,就像 (50+4) 有效,或 (27*2) 或任何其他表达式一样。

也许您可以向我们提供有关您看到的这个“质量标准”错误的更多信息?也许有人不喜欢括号,因为它们是不必要的。

于 2012-07-17T03:07:00.440 回答
0

可能是这样编写的,以便于将来的更改;考虑更改541024*54or 1024+54-- 使用括号,可以直接进行更改而无需进一步考虑。如果在没有括号的情况下进行更改,那么在程序中使用的任何地方,something运算符评估的优先级都很重要。

于 2012-07-17T03:20:55.990 回答