c语言:宏里面参数不加括号容易出错,在使用时尽量加括号及举例

宏里面参数不加括号容易出错,在使用时尽量加括号

程序1:

#include<stdio.h>

#define SQARE(X) X*X

int main()

{

int  n = 10;

int m=SQARE(n);

printf("m=%d\n",m);

return 0;

}

结果:

m=100

请按任意键继续. . .

分析:貌似没有出问题,请看下面两个例子

程序2:

#include<stdio.h>

#define SQARE(X) X*X

int main()

{

int m = SQARE(1 + 3);//1+3*1+3=7

printf("m=%d\n", m);

return 0;

}

结果:

m=7

请按任意键继续. . .

改正程序2:

#include<stdio.h>

#define SQARE(X) (X)*(X)

int main()

{

int m = SQARE(1+3);//(1+3)*(1+3)=16

printf("m=%d\n",m);

return 0;

}

结果:

m=16

请按任意键继续. . .

程序3:

#include<stdio.h>

#define ADD(X) X+X  //不加括号容易出错

int main()

{

int m = 10*ADD(2);//10*2+2

printf("m=%d\n",m);

return 0;

}

结果:

m=22

请按任意键继续. . .

改正程序3:

#include<stdio.h>

#define ADD(X) (X+X)

int main()

{

int m = 10*ADD(2);//10*(2+2)

printf("m=%d\n",m);

return 0;

}

结果:

m=40

请按任意键继续. . .

时间: 2024-10-13 06:30:17

c语言:宏里面参数不加括号容易出错,在使用时尽量加括号及举例的相关文章

C语言宏函数参数的连接

#include<stdio.h> #define Calculate_Max(A,B) A>B?A:B #define Calculate_Min(A,B) A<B?A:B #define Calculate(A,B,NAME) Calculate_##NAME(A,B) int main(void) {         printf("%d\n",Calculate(5,8,Max));         return 0; } 使用宏函数或者宏函数时,注意如

new对象时,类名后加括号与不加括号的区别

[1]默认构造函数 关于默认构造函数,请参见随笔<类中函数> 请看测试代码: 1 #include <iostream> 2 using namespace std; 3 4 // 空类 5 class empty 6 { 7 }; 8 9 // 一个默认构造函数,一个自定义构造函数 10 class Base 11 { 12 public: 13 Base() 14 { 15 cout << " default Base construct " &

C语言中带参数的宏

带参数的宏定义有如下的格式: [#define 指令----带参数的宏] #define 标识符(x1,x2,……,xn) 其中  x1,x2,……xn是标志符(宏的参数) 注意:在宏的名字和括号之间必修没有空格. 如果有空格,预处理会认为是在定义一个简单的宏,其中(x1,x2,……,xn)是替换列表的一部分 当预处理器遇到一个带参数的宏,会将定义存储起来以便以后使用.在后面的程序中,如果任何地方出现了标识符(y1,y2……,yn)格式的宏调用(其中y1,y2, ……yn是一些列标记),预处理器

常用的C语言宏定义

常用的C语言宏定义 1,防止一个头文件被重复包含      #ifndef COMDEF_H      #define COMDEF_H          //头文件内容      #endif       2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植.       typedef   unsigned char       boolean;      /* Boolean value type. */             typedef   uns

[转载]c语言宏定义

一. #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能理解该命令的本质,总是在此处产生一些困惑,在编程时误用该命令,使得程序的运行与预期的目的不一致,或者在读别人写的程序时,把运行结果理解错误,这对 C语言的学习很不利. 1 #define命令剖析 1.1   #define的概念 #define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为

转载--c语言宏定义(2)

作者:独舞风 链接:c语言宏定义(2) 1.如何区分宏定义中的“宏名称”和“宏字符串”?对于带参数的宏又该注意什么? 在宏定义中,“宏名称”和“宏字符串”是通过“空格”来区分的,在宏的扩展中,空格会对扩展的结果造成很大的影响.编译器在处理时宏定义时,首先从“#define”后第一个空格开始读取字符串,直到遇见下一个空格为止,两个空格之间的字符串为“宏名称”,确定好“宏名称”之后,本行的所有其他字符串都为“宏字符串”.图示:#define + N个空格(1 < N) + 宏名称(中间没有空格) +

C语言宏的高级应用

原文:C语言宏的高级应用 关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号.比如下面代码中的宏: #define WARN_IF(EXP) do{ if (EXP) fprintf(stderr, "Warning: " #EXP "); } while(0) 那么实际使用中会出现下面所示的替换过程: WARN_IF (divider == 0);被替换为

C语言宏定义使用技巧

写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等.下面列举一些成熟软件中常用得宏定义...... 1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植. typedef  unsigned char      boolean;     /* Boolean value type. */ type

C语言中可变参数的函数(三个点,“...”)

C语言中可变参数的函数(三个点,"...") 本文主要介绍va_start和va_end的使用及原理. 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解. 介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理: 1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表 void foo(...); void foo(parm_list,...); 这种方式和我们以前认识的不大