c语言 逻辑错误怎么解决,C语言面试题---逻辑短路问题

版权声明:本文转载于公众号TeachPlus---C语言面试题---逻辑短路问题

写出下面程序的输出

#include 

int main()

{

int a=5,b=6,c=7,d=8,m=2,n=2;

(m=ad);

printf("%d\t%d",m,n);

return 0;

}

本题答案

答案为1,2

本题解析

本题的考察重点在于逻辑运算符的短路问题。

在逻辑判断中,常常需要判断多个条件,如:

if A and B;

这时,当A为false时,无论B值是什什么,结果都为false,

所以可以不用判断B,直接跳过。这种情况称为逻辑短路路。

逻辑短路有许多应用,如

if(name != NULL && name.equals("admin"))

{

//do somethings

}

这种情况下当name为null时,直接跳过判断name.equals("admin"),

如果没有短路路效应,后面是有可能报空指针异常的。

还有,满足某条件时执行函数

f != null && ff();

这样的语句,等价于

if  (f != null)

{

f();

}

但是写法更更为简练。

所以,对于本题来说,因为使用的是逻辑或运算符,

因此只要两个条件中有一个为真,则整体为

真,计算的时候先计算m=ad不予计算,故该程序的输出为1,2

相关知识点

如果对上面的程序作出如下修改:

# include 

int  main()

{

int a=5,b=6,c=7,d=8,m=2,n=2;

(m=a>b)&&(n=c>d);

printf("%d\t%d",m,n);

}

则输出值为0,2

该题的迷惑性更为大一点,程序首先计算m=a>b的值,

因为a=4,b=6,所以a>b不成立,取值为0,

即m=0,整体表达式为假。因为使用的是逻辑与运算符,

必须两遍都为真,整体为真,所以当程序

判断一个条件为假的时候,则进行短路路操作,

第二个表达式不予就算,故该程序的整体输出为0,2.

接下来可以看一道更更为巧妙的面试题,这是微软的一道题目:

原题是:求 1 + 2 + 3 + … + n

要求:

不能用乘除法,不能用if if, while, do_while, for, switch, case,

不能用(a < b ? a : b)三目运算符

答案应为

# include 

int  test( int n ,  int *sum)

{

n&& test(n-1,sum);

return *sum += n;

}

int  main()

{

int ret = 0;

test(100,&ret);

printf("%d\n",ret);

return 0;

}

如果没有那么多的限制的话,这是一道入门级的题目,但是正是因为有那么多的限制,

所以这道题目才变得有意思起来,这道题目主要考察两个方面,

一个是递归的使用,一个就是逻辑短路的使用了。

递归的使用是显而易见的,不再赘述,而对于逻辑短路来说,

用的就比较精妙了,大家可以看一下,作为参考。

Java逻辑运算符深度解析:从短路求值到优先级陷阱与实战避坑 在编程中,逻辑运算符是构建条件判断和程序流程控制的基础。其核心原理在于对布尔值进行逻辑组合,以决定代码的执行路径。理解短路求值与完全求值的区别,是掌握其技术价值的关键。短路运算符(&&、||)能提升代码性能与安全性,通过避免不必要的计算来优化执行效率,尤其在涉及空指针检查或高开销方法调用时至关重要。而按位运算符(&、|)则更侧重于底层位操作,常用于权限控制等场景。在实际应用开发中,运算符的优先级常常是导致隐蔽Bug的根源,例如在混合使用&&和||时,若不明确使用括号,可能引发逻辑错误或空指针异常。本文通过一 阅读详情

相关推荐

射频总集篇:(不断更新)

射频每一章涉及到的重点理论/设计方法 CHAPTER 1 传输线理论 输入阻抗Zin,负载阻抗ZL,驻波比ρ,反射系数 CHAPTER 2 波导 矩形波导,圆波导,同轴线 CHAPTER 3 微型带状传输线 微带线的参数设计,带状线的参数设计 CHAPTER 4 ...

jieyannn的博客 1899

C语言中的逻辑短路

浅析C语言逻辑短路

qq_45861632的博客 3407

PINN内嵌物理知识神经网络入门及文献总结

内嵌物理知识深度学习方法(PINN)已经成功用于解决各类科学计算问题,其本质是将物理先验知识嵌入神经网络训练中,将一个求解PDE的问题转化为一个优化问题。这篇博客主要记录PINN相关论文

山里娃的博客 7万+

C语言中常见的逻辑错误

记录交流

用于记录学习的过程,不做商业用途。 3678

C语言 逻辑短路

这几天学习 传智播客关于C的教学视频,看到一个有趣的问题,以前在大学做课程设计的时候,好像也碰到过,但当时自己和小伙伴一直没有解决。就是关于C语言逻辑短路问题 以下内容解释为转载: &&前面是0时,&&符号后面的不计算. ||前面不是0时,||号后面的不计算. 这就是C语言短路现象. 其实就类似于数学0*x/y,后面的x/y根本没有必要计算

huguozhang1986的博客 1414

C语言逻辑运算符-----短路(详解)

C语言逻辑运算符

weixin_45150754的博客 1661

C语言逻辑运算短路

1——或逻辑短路 #include int main() { int a=5,b=6,c=7,d=8,m=2,n=2; (m=ad); printf("%d\t%d",m,n); } 输出的结果为1,2.为什么呢,因为a 2——与逻辑短路 #include int main() { int a=5,b=6,c=7,d=8,m=2,n=2; (m=a>b)

向着苦逼的程序员努力 2353

C语言短路操作

C语言中常用的短路操作符有两个,即逻辑与(&&)和逻辑或(||)。对于逻辑与(&&)操作符,当左侧的表达式为假(非零)时,整个表达式的结果为假,并且右侧的表达式不会被求值。只有当左侧的表达式为真(零)时,才会继续求值右侧的表达式。对于逻辑或(||)操作符,当左侧的表达式为真(非零)时,整个表达式的结果为真,并且右侧的表达式不会被求值。只有当左侧的表达式为假(零)时,才会继续求值右侧的表达式。

淡巴枯的博客 297

c语言中的符号总结,C语言中的符号总结

1、注释符号 //和/* ...*/2、续行符号 \3、转义符号 常用:\r 和 \n 等4、单引号 ‘括起来的一个字符代表整数5、双引号 “括起来的字符代表一个指针单引号 ‘括起来的一个字符代表整数,双引号 “括起来的字符代表一个指针。所...

weixin_31960565的博客 1万+

五·C语言之·操作符这么有趣的嘛?

1.算术操作符 当除号两端都是整数的时候,执行的是整数除法,两端只要有一个浮点数,执行的就是浮点数的除法 int main() { int ret = 10 % 3; printf("%d\n", ret); printf("%d\n", 10 / 3); printf("%lf\n", 10.0 / 3); return 0; } 1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。 2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点..

kikokingの比特宇宙 5480

c语言中各个符号的含义总结,C语言中的符号总结

1、注释符号       //和/* ...*/2、续行符号         \3、转义符号       常用:\r 和 \n 等4、单引号 ‘括起来的一个字符代表整数5、双引号 “括起来的字符代表一个指针单引号 ‘括起来的一个字符代表整数...

weixin_34061241的博客 3万+

C语言特殊面试问题

摘要:本文总结了C语言中多个关键知识点。宏操作符"#"用于字符串化参数,"##"用于令牌拼接;extern "C"确保C++兼容C符号;strlen("\0")=0而sizeof("\0")=2;struct分配独立内存,union共享内存;左值可被赋值,右值为临时数据;有/无符号数运算会转为无符号;短路求值会跳过不必要的表达式;大/小端描述字节存储顺序;++a先增后用,a++先用后增。

cy18779588218的博客 394

C语言操作符详解(和bug郭一起学C系列)

点击目录自动跳转操作符和表达式操作符算数操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符条件操作符条件表达式其他操作符表达式求值隐式类型转换算术转换操作符属性 操作符和表达式 我们在初始C语言已经大致了解了操作符,我们今天一起详细解剖操作符和表达式求值。 操作符 C语言操作符很多,但大致进行分类后,有以下几种操作符 //算数操作符 + - * / % //移位操作符 << >> //位操作符 & | //赋值操作符 = += -= *= /

bug郭的博客 1157

【一篇文章带你重温重点】C语言操作符

文章目录 🚲算术操作符 🚲移位操作符 🚲位操作符 🚲赋值操作符 🚲单目操作符 🚲关系操作符 🚲逻辑操作符 🚲算术操作符 加( + ) 减( - )乘( * )除( / ) 取模( % ) 算术操作符是我们日常用的最多的,也是大家最熟悉不过的。 🌟要注意以下几点 1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。 2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。 3. % 操作符的两个操作数必须为整数。返回的是整除之后的余..

记录学习点滴 1234

Java逻辑运算符深度解析:从短路求值到字节码实现与实战避坑

在编程语言中,逻辑运算符是构建程序决策流程的基础组件,用于组合布尔表达式以控制程序执行路径。其核心原理在于求值策略,主要分为短路求值与非短路求值。短路求值(如&&和||)在确定整个表达式结果后,会跳过后续不必要的计算,这一特性带来了显著的技术价值:它能提升性能,避免执行高开销操作;更重要的是,它能保障程序的正确性与健壮性,例如通过`if (obj != null && obj.isValid())`这样的模式有效防止空指针异常。在应用场景上,短路运算符广泛应用于条件判断、循环控制以及函数式编程(如Strea

weixin_30700977的博客 402

C语言中的符号总结

1、注释符号       //和/* ...*/ 2、续行符号         \ 3、转义符号       常用:\r 和 \n 等 4、单引号 ‘括起来的一个字符代表整数 5、双引号 “括起来的字符代表一个指针 ...

weixin_34368949的博客 362

C语言编程实例大全与面试实战项目

在现代软件工程中,模块化设计是构建可维护、可扩展系统的基石。C语言虽然是一门过程式编程语言,但其通过函数机制为程序员提供了强大的抽象能力。函数不仅是代码复用的基本单元,更是实现逻辑分离和职责划分的核心工具。深入理解函数的定义方式、调用机制以及参数传递模型,对于编写高效且安全的C程序至关重要。本章将从函数的抽象思想出发,剖析其底层运行时行为,并结合典型实例探讨参数传递的不同模式与递归技术的应用边界。

weixin_35706255的博客 847

【Java之轨迹】第一章:运算符总结(当C语言遇上Java)

—— 目录 ——◉ Java运算符(与C作比较)(一)取余 % 可以对整型取余,也可以对实型取余(二)加号 + 可以做加法运算和连接运算 (三)拓展赋值运算符自带类型转换(四)位运算符与逻辑运算符注意(五)单一字面值不可以作为语句(六)借助位运算快速执行乘法 ◉ Java运算符(与C作比较) (一)取余 % 可以对整型取余,也可以对实型取余 float a = 2.5f; double b = 1.2; double c = a % b; System.out.println(c); 此段代码合法 运行

Ice__Clean的博客 394

地级市城镇居民人均消费性支出(数据权威)

消费性支出:主要指家庭日常的衣食住行用等生活开销,参照国家统计局的家庭支出项目统计,具体又分为8个子项目:食品、衣着、居住、家庭设备及用品、交通通讯、医疗保健、文教娱乐、其他消费性支出。居民消费支出是家庭最主要的支出,构成了家庭总支出的85%以上。数据可以用于居民消费的研究。1.资料名称:地级市、城市各市城镇居民人均消费性支出数据2.数据范围:302个城市,2022-1995年最新数据,可以用于居民消费的研究3.时间范围:1995-2022年4.数据来源:国家信息中心宏观经济与房地产数据库(http://www.crei.cn),最新年份数据来源于数据库统计月报、统计公报等。

上一篇: vs创建c语言头文件,VSCode添加头文件 VSCode添加头文件(C/C++)的实现示例
下一篇: 青岛理工大学c语言考试题,青岛理工大学C语言答案.doc
weixin_30220177
博客等级 码龄8年 30粉丝 79原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值