C中的#define指令给出了模棱两可的答案

时间:2015-10-17 14:03:47

标签: c c-preprocessor

#include <stdio.h>
#define SQR(x) x*x
int main()
{
    printf("%d",225/SQR(15));
    return 0;
}

此代码的输出是225.我无法理解这里发生了什么。 如果我使用#define SQR(x) (x*x)然后它工作正常我得到因为我们应该使用括号如果我们有一个带有一些运算符的表达式。 但在之前的案例中,我并不清楚究竟发生了什么。为什么答案是225?

4 个答案:

答案 0 :(得分:3)

225/SQR(15)宏没有功能 - 它们只是宏,文本替换。如果您使用SQR表达式并将15*15替换为225/15*15,那么您将获得/,因为*255/15*15 = 255保存优先级并保持关联 - <asp:RegularExpressionValidator ID="regexpName" runat="server" ErrorMessage="This expression does not validate." ControlToValidate="txtName" ValidationExpression="^[\+0-9\-\(\)]{8,12}$" />

答案 1 :(得分:2)

注意步骤

  

1)225 / SQR(15)

     

2)225/15 * 15

由于优先权而首先执行分部

  

3)15 * 15

     

4)225

答案 2 :(得分:2)

宏只进行替换(在编译代码之前完成)。

因此以下一行

printf("%d",225/SQR(15));
替换后的

将成为:

printf("%d",225/15*15);

现在这个表达式的计算结果为225(基本数学:先划分 - > 15 * 15,然后乘以 - > 225)

使用括号解决您的问题(然后它变为225 /(15 * 15))。 :)

答案 3 :(得分:0)

在文本编辑器中将#define视为文本替换工具;它的工作方式相同(好吧,差不多)。

为避免此类错误,您可能需要遵循以下两条规则:

  1. 使用宏时,请始终对宏的每个“变量”和整个结果使用括号。
  2. 示例:

    #define MAX(a, b) ((a) > (b) ? (a) : (b))
    
    1. 如果出现意外行为,请使用命令行工具cpp(c预处理器)查看宏的实际解释方式。
    2. 示例:

      $ cpp main.c