调用函数但我无法理解算术的逻辑

时间:2016-06-21 19:05:00

标签: c

#define N 4
#define EXPON(x) x * x * x
#define HALF(x) x * 0.5

int main(){
    int i = N + 6;
    int j = HALF(i);
    int k = EXPON(j + 0);
    printf("%d %d %d\n",i, j, k);
}

j的回报在某种程度上不等于(j+0)的总和,有人可以解释一下吗?

1 个答案:

答案 0 :(得分:8)

你实际上并没有调用函数,而是使用类似函数的宏。宏执行文本替换,因此在扩展之后:

call SQLJ.INSTALL_JAR('C:\path_to_libraries\commons-lang3-3.4.jar', 'APP.commons_lang', 0);
call SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath', 'APP.commons_lang');

create function replace (sourceString varchar(8000), searchString varchar(8000), replaceString varchar(8000))
returns varchar(8000)
parameter style java no sql
language java external name 'org.apache.commons.lang3.StringUtils.replace';

select
    replace('bruce bogtrotter', 'bruce', 'john')
from SYSIBM.SYSDUMMY1

成为这个:

int k = EXPON(j + 0);

其中(由于运算符优先级)与此相同:

int k = j + 0 * j + 0 * j + 0;

这不是你想要的。

在定义类似函数的宏时,您应该始终将参数括起来生成表达式:

int k = j + (0 * j) + (0 * j) + 0;

所以现在你会得到你所期望的:

#define EXPON(x) ((x) * (x) * (x))