c中的意外输出

use*_*192 2 c output

我是c语言的新手.我只是想知道为什么我的宏不能正常工作.它给出的输出为13,我的预期输出为24.

#include<stdio.h>
#define mult(a,b) a*b
int main()
{
    int x=4,y=5;
    printf("%d",mult(x+2,y-1));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Gri*_*han 6

mult(x+2,y-1)扩展到x +2 * y -1等于4 + 2 * 5 -1给出输出:13.

您可能期待answer (4 + 2) * (5 -1)= 6 * 4= 24.为了使它像这样展开,你应该编写parenthesize宏,因为@ H2Co3也建议:

#define mult(a,b) ((a)*(b))
Run Code Online (Sandbox Code Playgroud)

Read aslo:那么,使用宏有什么问题?作者:Bjarne Stroustrup.


poo*_*ank 5

这是因为C宏是简单的文本替换,宏编写器必须确保在替换时围绕每个宏变量插入括号,并围绕宏扩展本身插入括号,以防止由此产生的扩展带来新的含义.

如果你观察你的程序:mult(a, b)定义为a * b

mult(x + 2, y - 1) = x + 2 * y - 1 = 4 + 2 * 5 - 1 = 4 + 10 - 1 = 13
Run Code Online (Sandbox Code Playgroud)

正确的方法是:

mult(a, b) ((a) * (b))
Run Code Online (Sandbox Code Playgroud)