当前位置:网站首页>C陷阱与缺陷 第2章 语法“陷阱” 2.6 “悬挂”else引发的问题
C陷阱与缺陷 第2章 语法“陷阱” 2.6 “悬挂”else引发的问题
2022-07-29 02:48:00 【weixin_客子光阴】
“悬挂”else引发的问题
if (x == 0)
if (y == 0) error();
else {
z = x + y;
f(&z);
}
编程人员的本意是应该有两种主要情况:x等于0以及x不等于0。对于x等于0,除非y也等于0(此时调用函数error),否则程序不作任何处理;对于x不等于0的情形,程序首先将x与y之和赋值给z,然后以z的地址为参数来调用函数f。
然而,这段代码实际上所做的却与编程者的意图相去甚远。原因在于C语言中有这样的规则,即else始终与同一对括号内最近的未匹配的if配合。
上面的程序实际上被执行的逻辑来调整代码缩进,大致如下:
if (x == 0) {
if (y == 0) error();
else {
z = x + y;
f(&z);
}
}
也就是说x不等于0,程序将不会做任何处理。如果要得到原来的例子中由代码缩进体现的编程者意图的结果,应该这样写:
if (x == 0) {
if (y == 0) {
error();
}
} else {
z = x + y;
f(&z);
}
原因在于第二个if已经被括号“封装”起来了。
有些C程序员通过使用宏定义也能达到类似的效果:
#define IF {if(
#define THEN ){
#define ELSE }else {
#define FI}}
这样,上例中的C程序就可以写成:
IF x == 0
THEN IF y == 0
THEN error();
FI
ELSE z = x + y;
f(&z);
FI
相当于
{
if(x == 0)
{
{
if(y == 0)
{
error();
}
}
}else
{
z = x + y;
f(&z);
}
}
还有一种方法就是为每个if语句配备一个else,这样就不会出现“悬挂”else的问题,不过会增加阅读的困难。
边栏推荐
- cuda-gdb提示:/tmp/tmpxft_***.cudafe1.stub.c: No such file or directory.
- C陷阱与缺陷 第3章 语义“陷阱” 3.1 指针与数组
- HTB-Blocky
- Zone --- line segment tree lazy marking board sub problem
- C language: judging letters
- PHP process communication series (I) named pipes
- 百度副总裁李硕:数字技术加持下中国劳动力成本上升是好事
- 万字详解 Google Play 上架应用标准包格式 AAB
- K210 - sound source location and sound recognition
- MySQL large table joint query optimization, large transaction optimization, avoiding transaction timeout, lock wait timeout and lock table
猜你喜欢
随机推荐
Day 8 notes
Linux下安装MySQL8.0的详细步骤
13_ue4进阶_蒙太奇动画实现一边走一边攻击
cuda-gdb提示:/tmp/tmpxft_***.cudafe1.stub.c: No such file or directory.
Available data sets for scene classification tasks (part)
Stm32c8t6 encoder motor speed measurement and Arduino photoelectric module speed measurement
C语言:判断字母
QT compilation of IOT management platform 48 characteristic function design
数仓中概念术语解析
MySql的安装配置超详细教程与简单的建库建表方法
会议OA之反馈功能
FTP协议详解
Interpretation of ue4.25 slate source code
盘点国内外项目协同管理软件:SaaS和定制化成趋势
【机器人学习】机械臂抓手matlab运动学与admas动力学分析
C语言小项目 -- 通讯录(静态版+动态版+文件版)
C language: Little Lele and Euclid
Groupby method
Verilog的时间系统任务----$time、$stime、$realtime
.NET 序列化枚举为字符串