define定义函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了define定义函数相关的知识,希望对你有一定的参考价值。
我想用define定义绝对值函数Abs,即Abs(x)输出的是x的绝对值。我是这样定义的:#define Abs(x) (x>=0 ? x:(-x))。请问为什么对于两个整数a,b,我运行Abs(a-b)得到的是错误的答案?
#define Abs(x) (x>=0 ? x:(-x))宏定义只是完全替换,不会自动给你加括号的
Abs(a-b)变成
Abs(a-b) (a-b>=0 ? a-b:(-a-b))
-a-b 就出现问题了,负号的优先级比减号高的
所以在宏定义里,每项运算都要加括号,因为括号的优先级最高,保证表达式的运算顺序不会发生改变
#define Abs(x) ((x)>=0 ? (x):(-(x))) 参考技术A 这是带参数的宏,不是函数,编译预处理的结果是字符替换,替换成如下形式:
(a-b>=0?a-b:(-a-b))
结果在a-b<0时并不正确,直接定义函数,当然如果是C,可能有数据类型的问题,如果是C++,可以定义一个模板
double Abs(double x)
return x >= 0 ? x : -x;
参考技术B 对于类似a-b表达式的情况,两种解决办法:
1. 引用的时候用 Abs((a-b)) 就可以了,加一对括号,将表达式看成一个量,就不会出错了
2.改define,每项都加括号 #define Abs(x) ((x)>=0 ? (x):(-(x))) 参考技术C c语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
带参宏定义的一般形式为: #define 宏名(形参表) 字符串
在字符串中含有各个形参。 带参宏调用的一般形式为: 宏名(形参表)
例如:
#defineM(y)((y)*(y)+3*(y))/*宏定义*/
k=M(5);/*宏调用*/
在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为: k=5*5+3*5
程序2:
//#include<cstdio>
#include<stdio.h>
#define MAX(a,b)((a>b)?(a):(b))
intmain(intargc,char*argv[])
intx,y,max;
printf("inputtwonumbers:");
scanf("%d%d",&x,&y);
max=MAX(x,y);
printf("max=%d\n",max);
return0;
上例程序的第一行进行带参宏定义,用宏名MAX表示条件表达式 (a>b)?a:b ,形参a,b均出现在条件表达式中。程序中 max=MAX(x,y) 为宏调用,实参x,y,将代换形参a,b。宏展开后该语句为: max=(x>y)?x:y; 用于计算x,y中的大数。
#define 条件编译
头文件(.h)可以被头文件或C文件包含;重复包含(重复定义)由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。 通过条件编译开关来避免重复包含(重复定义)
C语言中定义常数变量怎么定义 用define的那种
举个例子 比如在函数中定义常数π
参考技术A 因为define是一种宏定义,所以他属于一种全局类型,不需要在函数中定义,只要在源代码开头定义的话,整个源文件都可以使用该变量,假如要要定义常数π,那就#define pi 3.1415926就可以了例如
#include <stdio.h>
#define pi 3.1415926
int main(...)
....
void function(...)
float a;
a=pi;
.....
有不懂追问吧,望采纳本回答被提问者采纳 参考技术B #define pi 3.1415926
以上是关于define定义函数的主要内容,如果未能解决你的问题,请参考以下文章