谁能解释一下
#define something (54)
意思是?为什么 54 在括号内?
#define something (54)
告诉 C 预处理器在实际编译代码之前用“(54)”替换任何匹配“something”的文本。
您经常会看到使用( )
around a的原因是,在某些情况下,当文本被替换为更大的表达式#define
时,它可以防止被替换的文本产生不利或未定义的行为。#defined
这种不利影响可能是运算符优先级的变化等。
将任何#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)”
括号是多余的。我无法想象在(54)
语义上与54
. 现在,如果我错了……给我看;我会学到一些新东西。
这种情况下的括号将被忽略。和写法一样:
#define something 54
他们只是帮助您喜欢数学,例如:
#define something (54-2)/2
不同于
#define someotherthing 54-2/2
你为什么要用这个
#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
当然,只要分配的值是一个简单的常量,就像在您的示例中一样,括号的存在对编译器没有任何影响。 这只是为了编写此代码或将来可能修改此代码的人的利益。 通过始终如一地应用这种形式的声明,作者试图减少人为错误的发生。
“()”是括号而不是[括号]。它本质上是一个空操作。任何时候 54 有效,(54) 都有效,就像 (50+4) 有效,或 (27*2) 或任何其他表达式一样。
也许您可以向我们提供有关您看到的这个“质量标准”错误的更多信息?也许有人不喜欢括号,因为它们是不必要的。
可能是这样编写的,以便于将来的更改;考虑更改54
为1024*54
or 1024+54
-- 使用括号,可以直接进行更改而无需进一步考虑。如果在没有括号的情况下进行更改,那么在程序中使用的任何地方,something
运算符评估的优先级都很重要。