整数除以宏定义的其他整数常量在C中返回错误?
在以下代码中,输出为30,应该是0。我错过什么了吗整数除以宏定义的其他整数常量在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); //
#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));