C语言-宏定义中括号的问题

C语言常见错误 对于刚学编程,刚接触C++的新手来说,编译运行报错是最头疼的一件事,爆出一堆英文,英语差一点的又不知道什么意思,所以也不知道如何去改,在此,我给大家传一份常见错误中英文对照表及简单解释,希望可以帮到大家:   fatal error C1003: error count exceeds number; stopping compilation 中文对照:(编译错误)错误太多,停止编译 分析 阅读详情

最近面试的时候 面试官让我写了一个用宏定义返回两个参数中的较小值,我直接就写了

#define min(a,b) (a<b)?a:b   

然后面试官问了我一句需要写括号么,当时问的有些懵,犹豫之后说应该不需要了吧。

回来之后就仔细查了一下,发现自己还是犯了错误。

首先我们需要知道宏定义是怎么在代码中使用的,在代码预编译阶段,宏定义是直接替换的

例如:
在代码中我们使用了min(a,b),而在代码预编译阶段就会直接将min(a,b) 直接替换成a<b?a:b

因为替换的原因,所以就可能会存在一些问题

例如:

#include<stdio.h>
#define min(a,b) (a>=b)? b:a
int mina(int a,int b){
return a>=b? b:a;
}
int main(){
printf("宏定义结果:%d\n",min(3,1)-1);
printf("函数结果:%d",mina(3,1)-1);
}

我们会发现运算的值
宏定义结果:1
函数结果:0

这里出现的问题就是因为优先级问题,当宏定义直接被替换成(a>=b)? b:a之后可以看成

printf("宏定义结果:%d\n",(3>=1)? 1:3-1);

这样答案应该就很明显了

所以宏定义中增加括号会增强代码的健壮性以及安全性

C++中宏定义的使用注意事项 宏定义是C语言的三种预处理功能之一,另外两种预处理是文件包含和条件编译。 阅读详情

相关推荐

【电子电力】IEEE33节点系统参数及拓扑图visio

IEEE33节点系统是一种广泛用于电力系统分析和研究的标准配电网络。该系统具有典型的辐射结构,适用于负载流分析、分布式发电优化及电力系统的可靠性评估。本报告主要基于IEEE33节点系统的拓扑图,讨论其在电子电力系统中的应用。通过MATLAB仿真分析了节点的电压分布、功率损耗等关键参数,并验证了系统的稳定性和有效性。

2401_84610415的博客 1万+

宏定义里面为什么要加括号?

在宏定义当中,常常可以看到宏的参数以及整个宏的定义都被小括号包围,就像下面的 MIN、MAX、ABS 宏一样: 上面的图截取自 iOS 的系统库,那为什么它们需要这些括号包围起来呢? 下面假如我们自定义了宏 ceil_div,代码如下: #define ceil_div(x, y) (x + y - 1) / y 这个宏的本意是将 x 除以 y,然后将得到的结果向上取整。比如 x = 4,...

chaoguo1234的专栏 1480

SAP BO系统启用邮件发送功能

目录 背景 维护邮件目标 启用邮件功能 背景 为了将BO报表或BO预警信息发送给特定的收件人,需要启用SAP BO系统的邮件发送功能。 维护邮件目标 1. 登录BO系统的中央管理控制台(CMC): http://<bo server name>:<port>/BOE/CMC 2. 点击“Organize”底下的“Servers”按钮进入BO服务器界面: 3. 点击“Servers List”进入服务器列表界面,右键点击JobServer&lt.

guowenming001的博客 1963

宏定义,记得要注意加括号的地方

宏定义:注意x,y值都有一个括号,和特定的符号时 需要加上括号! // SWAP(x, y)               交换x,y的值   #define SWAP(x, y) \       (y) = (x) + (y); \       (x) = (y) - (x); \       (y) = (y) - (x);   求最大值和最小值    #define  M

knight 6653

FDTD仿真进阶:液晶偏振调控与双折射效应全解析

本文深入解析了在Lumerical FDTD仿真中如何对液晶材料进行偏振调控与双折射效应建模。通过单轴液晶和螺旋扭曲液晶(TN-LCD)两大实战案例,详细阐述了从各向异性材料参数设置、LC网格属性配置到偏振椭圆分析的全流程,帮助工程师精准模拟液晶的光开关行为,优化如显示器等器件的光学性能。

chair的专栏 745

别再让信号‘撞墙’了!手把手教你用嘉立创阻抗计算器搞定PCB高速线(附免费压层结构选择)

本文详细介绍了如何使用嘉立创阻抗计算器解决PCB高速线设计中的阻抗匹配问题,避免信号反射和传输损耗。通过免费压层结构选择和五步计算法,帮助工程师快速掌握USB3.0差分线等高速信号的设计技巧,提升PCB设计效率和信号质量。

weixin_30736301的博客 279

C++中宏定义字加括号的意义

1.示例 #define DI_INPUT_NUM (11) 2.为什么宏定义要加括号 强烈建议宏定义要给表达式加括号,这是一种良好的编程习惯,可以避免出错! 宏定义的本质是直接替换!!!宏定义后面的表达式直接替换宏定义名字! 下面举例来说明 下面两种宏定义,产生了截然不同的结果: #define DNUM 11+2 //宏定义方式1 #define DNUM (11+2) //宏定义方式2 在程序中使用到了

t18438605018的博客 5170

GPU基准测试全攻略:从驱动验证到深度学习环境部署

GPU基准测试是评估显卡性能与稳定性的核心方法,其原理在于通过标准化负载程序,对GPU的计算单元、显存和散热系统进行压力测试。这项技术的价值在于,它能科学量化硬件性能,确保软件环境配置正确,为深度学习、科学计算等重负载任务提供稳定基础。在实际应用场景中,无论是新卡验机、排查深度学习环境问题(如“warning: no usable gpu found”报错),还是验证“PyTorch GPU版本安装”后的实际算力,系统的基准测试都是不可或缺的工程实践环节。通过结合通用计算测试与深度学习框架验证,用户可以提前

weixin_30080745的博客 343

宏定义的使用

宏定义的使用

J8121的博客 1214

Mac安装Claude Code的3种方式及5类报错解决方案

介绍在Mac上安装Claude Code的3种实测可行方式(官方dmg、Homebrew+ARM原生构建、Docker容器化),并针对Gatekeeper签名验证失败、Rosetta 2内存对齐崩溃、Python ABI兼容性冲突等5类高频报错提供根因分析与可复现解决方案,覆盖M1–M3及Intel

weixin_28728443的博客 361

【系统分析师】核心考点:100个高频知识点汇总

本文系统梳理了系统分析师考试的11大领域高频考点,重点解析了计算机硬件与体系结构的7个核心知识点:计算机五大部件(CPU/存储器/总线等)、校验码类型(奇偶/海明/CRC)、CISC与RISC指令系统对比、总线分类与特性、RAID磁盘阵列级别、流水线技术原理及Flynn系统分类法。内容涵盖硬件组成、数据校验、指令架构、存储技术等关键概念,通过表格对比和公式说明,为考生提供结构化的知识框架与备考重点。

数据知道的博客 5569

C语言中宏定义的盲区有哪些?

再用pChar 定义两个变量,之后用操作符sizeof读取变量所占用内存大小,如果是指针类型的就占4个字节,如果是字符型的就占1个字节。#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。与宏定义相挂钩的就是优先级,算数运算符的优先级高于条件运算符,展开如下。1:3,首先进行算符运算符的运算,即4>3?答案是否定的,在f与(x)之间存在一个空格,导致变成了如下定义。命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。

yx5666的博客 555

基于STM32设计的智能手环(ESP8266+华为云IOT)_178

为了满足用户对健康监测的需求,手环项目集成了血氧检测、心率检测、体温检测等功能。这些功能采用了专门的传感器模块,如MAX30102、DS18B20等,确保了测量数据的准确性和可靠性。同时,为了方便用户了解自己的运动情况,项目还加入了行走步数统计功能,通过MPU6050模块实现精确计步。

2402

C语言预处理02

小甲鱼预处理02 源码①: #include <stdio.h> #define SAY(y) (y) void main() { int i=0; char say[]={73,32,108,111,118,101,32,102,105,115,104,99,46,99,111,109,33}; while( say[i] ) { say[i]=SAY(say[i]); i++; } printf("\n\t%s\n\n",say); } 运行结果如下: 源码②

Joaquin233的博客 229

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C语言易错点总结

C语言易错点总结 1.sizeof是关键字而非函数。 2.定义变量时,不能同时对多个变量连续赋初始值。 eg:int m=n=1;//错误 3.scanf语句: "%c"将读入空白符," %c"能忽略空白符。 "%s"遇到空白符读入结束。 ps:要想将有空格的字符串存入char型数组中,可使用gets(str) ...

Snowzhao的博客 2411

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C语言宏定义括号使用规范:避免运算符优先级陷阱的编程实践

在C语言编程中,宏定义作为预处理器指令,通过文本替换机制实现代码复用和条件编译,是提升开发效率的重要工具。其核心原理在于预处理器对源代码进行字面替换,而非编译器执行的语法分析与求值。这一特性使得宏在带来灵活性的同时,也潜藏着因运算符优先级和参数多次求值导致的计算错误风险,直接影响代码的正确性与安全性。尤其在嵌入式系统、操作系统内核及高性能计算等对稳定性和效率要求极高的应用场景中,不规范的宏使用可能引发难以调试的隐蔽bug。因此,掌握宏定义中完备括号的使用规范——即对宏体整体及每个参数单独添加括号包裹——成为

weixin_34127717的博客 314

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【C语言底层编程核心技巧】:参数括号如何影响宏展开的正确性?

掌握C语言宏函数的参数括号使用技巧,避免常见展开错误。详解运算符优先级陷阱与正确括号包裹方法,适用于底层开发与跨平台代码优化,提升程序稳定性与可维护性,值得收藏。

QuickProceed的博客 454

【硬核C语言】吃透预处理:#define、#include、#ifdef实战

很多人写C语言只会直接复制头文件、随便定义宏,遇到跨平台编译、代码冗余、多版本兼容问题就一头雾水。预处理是编译第一步,不用链接、不用内存分配

qq_25196865的博客 177

#define宏&#和##的对比&条件编译&头文件

比如,写⼀个函数求2个数的较大值的时候,不同的数据类型就得写不同的函数。当宏参数在宏的定义中出现超过⼀次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的后果。乘法运算先于宏定义的加法,所以出现了 55 .这个问题,的解决办法是在宏定义表达式两边加上⼀对括号就可以了。如果是,它们首先被替换。参数列表的左括号必须与name紧邻,如果两者之间有任何空白存在,参数列表就会被解释为stuff的⼀部分。2. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。

努力学习C、C++、Linux等! 1030

关于C语言刷题(#define宏定义函数的常见错误)

关于C语言刷题(#define宏定义函数的常见错误) 首先我们来先看对#define的定义 define,宏定义,C语言中预处理命令一种。分为无参宏定义和带参宏定义。无参宏定义的一般形式为:#define 宏名 字符串;带参宏定义的一般形式为:#define 宏名(参数表) 字符串; 其实#define不仅可以定义常见变量,也可以定义带参函数 在使用中一定要注意#define的边界问题(可以简单理...

九分先生的博客 3527

c语言宏定义中 号作用,C语言宏定义中的#,##,#@及\符号的作用

1、#(stringizing)字符串化操作符作用:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定 义中,且必须置于宏定义体中的参数名前。如:#defineexample(instr)printf("theinputstringis:\t%s\n",#instr)#defineexample1(instr)#instr当使用该宏定义时:ex...

weixin_39897449的博客 2019

【蓝桥杯】【C语言】寒假刷C语言题库笔记

寒假刷C语言题库的心得(大一) 寒假刷C语言题库时的一些心得注意点,借助这个平台做一下整理和分享,顺序皆按照自己的做题顺序排布。因本人才大一,水平有限,整理的都是基础中的基础,不足之处欢迎各位指点。 这是我的做题网站: [C语言网](https://www.dotcpp.com/oj/problemset.php?page=2&mark=0) 1. 中括号的重要性: if()后面一定要加上中括号{}再在中括号中输入想要执行的操作。如果只有一条语句那加不加问题不大。 2.

m0_53347750的博客 1085

python(1)——宏定义+程序语法元素分析

宏定义和程序语法元素

m0_68735986的博客 2万+

【C语言初阶笔记】初识c语言

1.什么是c语言 C语言是一门面向过程的计算机编程语言,与C++、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速、工作量小、可读性好、易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编语言代码生成的目标程序效率低10%-20%。因此,C语言可以编写系统软件。 (1) 语言组成 数据类型 C的数据类型包括:整型(short、int、lon

ljp 3634

C语言复习之指针、宏定义

C语言复习

u014439531的博客 1542

【C语言总结】宏定义,预处理

宏定义简单宏格式:#define 标示符 替换列表#define N 100 int a[N];//N就是100带参数的宏格式:#define 标示符(x1, x2, x3,……xn) 替换列表#define MAX(x, y) ((x) > (y) ? (x) : (y))注意:程序编译的时候会把大写的标示符替换成原来的表达式,所以编译时候程序会增大。优点或者缺点优点 ①程序可能会稍微快些 ②

沸沸腾的专栏 946
上一篇: Beyond Compare 4遇到的一些问题
下一篇: C语言 - i++和++i
Way0621
博客等级 码龄7年 5粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值