#include <stdio.h>
#define SQR(x) x*x
int main()
{
printf("%d",225/SQR(15));
return 0;
}
此代码的输出是225.我无法理解这里发生了什么。
如果我使用#define SQR(x) (x*x)
然后它工作正常我得到因为我们应该使用括号如果我们有一个带有一些运算符的表达式。
但在之前的案例中,我并不清楚究竟发生了什么。为什么答案是225?
答案 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
视为文本替换工具;它的工作方式相同(好吧,差不多)。
为避免此类错误,您可能需要遵循以下两条规则:
示例:
#define MAX(a, b) ((a) > (b) ? (a) : (b))
cpp
(c预处理器)查看宏的实际解释方式。示例:
$ cpp main.c