整数除以宏定义的其他整数常量在C中返回错误?

整数除以宏定义的其他整数常量在C中返回错误?,c,C,在以下代码中,输出为30,应该是0。我错过什么了吗 #include <stdio.h> #define L 30 #define N2 L * L int main() { unsigned int id = 30; printf("k = %d\n", id/N2); //this prints 30 but 30/900 should be zero! printf("k = %d\n", id/900); //

在以下代码中,输出为30,应该是0。我错过什么了吗

#include <stdio.h>
#define L 30
#define N2 L * L

    int main() {


        unsigned int id = 30;

        printf("k = %d\n", id/N2); //this prints 30 but  30/900 should be zero!
        printf("k = %d\n", id/900); //this prints 0  OK!

        return 0;
    }
#包括
#定义L30
#定义N2 L*L
int main(){
无符号整数id=30;
printf(“k=%d\n”,id/N2);//这将打印30,但30/900应为零!
printf(“k=%d\n”,id/900);//这将打印0 OK!
返回0;
}
操作顺序:

30/30*30
1*30
<代码>30/900为
0

您需要在宏中插入括号以获得正确的行为:

#define N2 (L * L)


这样就可以了。

尝试手动扩展宏,看看它是什么样子的
#define N2 L*L
应该是
#define N2(L*L)
。括号很重要,真是个错误@SusmitAgrawal:理想情况下,替换应为
((L)*(L))
,以便使用
A+B
等参数生成预期答案。没有内括号,如果
A
是20,
B
是10,你就不会得到预期的结果。@JonathanLeffler你是对的,我的错误。在替换中,每个
L
都需要括号。这就是为什么使用
const
\define
更好的原因,如果这是一个选项的话。
#define
在代码本身中展开。常量
在引入之前进行计算。@tadman:这与使用宏无关,只是没有使用正确的代码。在C中, const 并不意味着“常量”。@ TooRealthFuffic在C++中的“Frasic C”模式可以。C++中没有“C模式”(VICE或NOD)。相同的语法并不意味着相同的语义!它确实需要在替换文本中的每个
L
周围加上括号。它确实需要。想象一下,当有人想要澄清L是其他两项的总和时<代码>#定义L10+20
#define N2 (L * L)
printf("k = %d\n", id/(N2));