C语言函数调用及宏定义代码实例

函数

#include<stdio.h>

int square(int x);
int square(int x){
    return x * x;
}

/**
 * 求x的平方
 */
int main(){
    int i = 1;
    while(i <= 100){
        // i=1,1<=100,square(1)=1*1=1,i++=2,2-1=1,即1的平方=1
        // i=2,i<=100,square(2)=2*2=4,i++=3,3-1=2,即2的平方=4
        printf("%d的平方是%d\n",i-1,square(i++));
    }
}

在这里插入图片描述

上面的代码很容易就能理解,下面尝试用宏定义的方式来实现功能。。。

宏定义

#include<stdio.h>

#define SQUARE(x) ((x) * (x))

int main(void){
    int i = 1;
    while(i <= 100){
        // SQUARE(i++)--->((i++)*(i++))
        // 先取i再++,再取i再++,之后对取出的i求平方
        // i=1,1<=100,i++,取i=1,后++=2,再取i=2,后++=3,i*i=1*2=2,i=3,3-1=2,即2²=2
        // i=3,3<=100,i++,取i=3,后++=4,再取i=4,后++=5,i*i=3*4=12,i=5,5-1=4,即4²=12
        // i=5,5<=100,i++,取i=5,后++=6,再取i=6,后++=7,i*i=5*6=30,i=7,7-1=6,即6²=30
        printf("%d的平方是:%d\n",i-1,SQUARE(i++));
    }
    return 0;
}

在这里插入图片描述
通过结果不难发现,宏定义求平方出错了。。。下面对代码进行拆分:

SQUARE(i++)通过拆分,变成:(i++) * (i++),
接着以下面步骤进行计算:
设i = 1,(1++) * (1++)
a.i++; // 取i = 1,后自增,i = 2
b.i++; // 取i = 2,后自增,i = 3,
c.1 * 2 = 2
d.i = 3,3 - 1 = 2,所以2[b中取出的2]的平方=2[c中求出的2]

备注:

在一定程度上,使用带参数的宏来代替函数实现一些简单的功能,程序的执行效率或许会高一些,因为宏定义是直接在预编译阶段替换到代码中,并不需要像函数一样,一次调用申请一次栈空间。
这并不意味着可以没有限制地使用宏定义,宏定义在使用时藏有许多的陷阱,如果一不小心就会写出带有bug的程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rsZheng4916

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值