文档章节

第10天C语言(06):带参数的宏定义

lyh2017iOS
 lyh2017iOS
发布于 2017/07/07 10:01
字数 763
阅读 2
收藏 0
点赞 0
评论 0

#pragma mark 带参数的宏定义 ###pragma mark 概念

/**
 宏定义并不会做任何运算, 无论是有参数 还是 没有参数都仅仅是在翻译成0和1之前做 一个简单的"替换"
 
 带参数的宏定义注意点
 1.一般情况下 建议写带参数的宏,给每个参数加上一个()
 2.一般情况下建议写带参数的宏的时候, 结果也加上一个()  // 请记住

 */

###pragma mark 代码

#include <stdio.h>
int sum (int v1, int v2)
{
    return v1 + v2;
}

/*
 define 代表要定义一个宏
 SUM 宏的名称
 (v1,v2) 参数, 注意点, 不需要写数据类型
 v1 + v2 用于替换的内容
 
 宏定义并不会做任何运算, 无论是有参数 还是 没有参数都仅仅是在翻译成0和1之前做 一个简单的"替换"
 
 带参数的宏定义注意点
 1.一般情况下 建议写带参数的宏,给每个参数加上一个()
 2.一般情况下建议写带参数的宏的时候, 结果也加上一个()
 
 */
#define SUM(v1,v2) v1+v2

// 要求定义一个带参数的宏,用于计算两个变量的乘积
//#define CF(v1,v2) v1*v2
#define CF(v1,v2) (v1)*(v2)

// 要求定义一个带参数的宏,用于计算某个数的平方
//#define PF(v1) (v1)*(v1)
#define PF(v1) ((v1)*(v1))

int main()
{
    
    /*
    int a = 10;
    int b = 15;
//    int res = sum(a, b);
    
//    SUM(a,b) v1 == a v2 == b
//    a+b
//    int res = a+b;
    int res = SUM(a, b);
     //    printf("res = %i\n",res);
     */
#warning 什么时候使用宏定义 什么时候使用函数
    /*
     什么时候用带参数的宏定义 什么时候用函数
     如果函数内部的功能比较简单,仅仅是做一些简单的运算 那么可以使用宏定义,使用宏定义效率更好,运算速度更块
     如果函数内部的功能比较复杂, 不仅仅是一些简单的运算,那么建议使用函数
    */
#warning 定义一个带参数的宏,用于计算两个变量的乘积
#warning 1.带参数的宏 参数没有加上()
    // CF(5 + 5,4+4)
    // 5 + 5 * 4 + 4    // 5 + 20 + 4 = 29
#warning 1.带参数的宏 参数加上()
//   CF(5 + 5, 4 + 4)
//    (5 + 5) *(4 + 4) == (10)*(8)
//    int res = CF(5 + 5, 4+4);   // 10 * 8 = 80
    
    
#warning 2.带参数的宏 结果没有加上()
//    int res = PF(4);
//    PF(2 + 2)
//    (2 + 2) * (2 + 2)
//   16 / 16 * 16 == 1 * 16 == 想要的结果为 16
//    PF(v1)  / PF(v1)  * PF(v1)
//    PF(2 + 2)  / PF(2 + 2)  * PF(2 + 2)
//    (2 + 2) *(2 + 2)  / (2 + 2) *(2 + 2)   * (2 + 2) *(2 + 2)
//     4 * 4            /       4 * 4       * 4 * 4
//      16      / 4 * 4         * 4 * 4
//      16/4 == 4 * 4 == 16 * 4  = 64 * 4 = 256 结果却为256
//    int res = PF(2 + 2) / PF(2 + 2) * PF(2 + 2);
    
    // 4 / 4 * 4  == 想要的结果 为 4
    //  PF(2)  / PF(2)  * PF(2)
    // (2 *2)   / (2) * (2) * (2)*(2)
    
#warning 2.带参数的宏 结果加上()
//    PF(2)  / PF(2)  * PF(2)
//    ((v1)*(v1))     / ((v1)*(v1))    * ((v1)*(v1))
//     ((2)*(2))      / ((2)*(2))      * ((2)*(2))
//      4               /   4           * 4  == 4 结果=4 是想要的
    int res = PF(2) / PF(2 ) * PF(2 );
    printf("res = %i\n",res);
    return 0;
}

© 著作权归作者所有

共有 人打赏支持
lyh2017iOS
粉丝 1
博文 354
码字总数 137380
作品 0
朝阳
十五、预处理指令1-宏定义

说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略 预处理指令简介 1....

长平狐 ⋅ 2013/03/28 ⋅ 0

C语言基础-07-预处理指令1-宏定义

预处理指令简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编...

Corwien ⋅ 2016/03/16 ⋅ 0

C语言-第九章、预处理命令

9_1 文件包含 格式:(1)#include<文件名> 多用于查找标准库函数文件 (2)#include"文件名" 通常用来包含自定义文件 9_2 宏定义 _2.1 简单的宏定义 一般形式:#define 标识符 字符串 如: ...

南风末 ⋅ 2016/11/06 ⋅ 0

c语言编译预处理和条件编译执行过程的理解

  在C语言的程序中可包括各种以符号#开头的编译指令,这些指令称为预处理命令。预处理命令属于C语言编译器,而不是C语言的组成部分。通过预处理命令可扩展C语言程序设计的环境。 一.预处理...

文艺小青年 ⋅ 2017/10/12 ⋅ 0

预处理指令

预处理指令简介 1.为了区分预处理指令和一般的C语句,所有预处理指令都以符号"#"开头,并且结尾不用分号 2.C语言提供的预处理指令主要有:宏定义、文件包含、条件编译 一、不带参数的宏定义 ...

吴金瑞 ⋅ 2017/05/09 ⋅ 0

宏定义总结

字符串常量定义时的换行问题 如果我们在一行代码的行尾放置一个反斜杠,c语言编译器会忽略行尾的换行符,而把下一行的内容也算作是本行的内容。这里反斜杠起到了续行的作用。 构建较长的字符...

wwl33695 ⋅ 2014/04/30 ⋅ 0

C语言 条件编译详解

预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。 在C 语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

c++中define用法

#define 将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本 该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义 #define <宏名>  <字符串> #de...

memristor ⋅ 2014/05/04 ⋅ 0

C语言的变参函数设计

在C语言中,函数参数的传递方式有值传和址传.值传是把实参的一个专用的、临时的复制值给被调函数中相应的形参被调用函数使用、修改这个传来的复制值,不会影响实参的值.址传则是把变量(实参)...

嗯哼9925 ⋅ 2017/12/25 ⋅ 0

不可小看的技术——C语言编程中的“宏”

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 03/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 25分钟前 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 33分钟前 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 39分钟前 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 49分钟前 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

容器之查看minikue的environment——minikube的环境信息

执行如下命令 mjduan@mjduandeMacBook-Pro:~/Docker % minikube docker-envexport DOCKER_TLS_VERIFY="1"export DOCKER_HOST="tcp://192.168.99.100:2376"export DOCKER_CERT_PATH="/U......

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

mysql远程连接不上

设置了root所有hosts远程登录,可是远程登录还是失败,原因可能如下: 登录本地数据库 mysql -uroot -p123456 查询用户表 mysql> select user,host,password from mysql.user; 删除密码为空的...

冰公子 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部