c - 布尔表达式中打印函数的行为
问题描述
语言:C
如果输入 0,则布尔表达式输出 0,否则输出 1。
按照上面的说法,
情况1:
输入
#include <stdio.h>
#include <stdbool.h>
main()
{
int a = 1,
b = 2;
bool res = ((a == b) && ("your "));
printf("res = %d", res);
}
输出
res = 0
案例二:
输入
bool res = (!(a == b) && ("your "));
printf("res = %d", res);
输出
res = 1
案例3: 现在我将prinf函数添加到(“你的”)
输入
bool res = ((a == b) && printf("your "));
printf("res = %d", res);
输出
res = 0 //adding printf doesn't change the output
案例4: 输入
bool res = (!(a == b) && printf("your "));
printf("res = %d", res);
输出
your res = 1 // i expected just "res = 1" not "your res = 1"
打印功能如何不在CASE 3中执行但在CASE 4中执行?
解决方案
根据 C 标准(6.5.13 逻辑与运算符)
4 与按位二进制 & 运算符不同,&& 运算符保证从左到右的求值;如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数。
在此声明中用作初始值设定项的表达式中
bool res = ((a == b) && printf("your "));
逻辑 AND 运算符的第一个操作数(a == b)
的计算结果为 0。因此,第二个操作数是调用的printf
不计算,
另一方面,在此表达式中用作声明中的初始值设定项
bool res = (!(a == b) && printf("your "));
第一个操作数的!(a == b)
计算结果为 1。因此,调用的第二个操作数也被printf
计算。
推荐阅读
- openstack - 如何在 keystone 会话中使用 senlinclient
- javascript - 如果表太大,隐藏一些列
- c# - 在 DAL 类 ThreadLocal 中创建 SqlConnection 是否安全?
- javascript - 如何在反应中重定向到一个 url 以及一个组件,以便传递给组件的道具不会丢失
- blockchain - Solidity 存储和计数颜色被投票
- python - 如何为 socket.io Python 配置服务质量配置?
- javascript - 材料表的标题闪烁和冻结问题(使用反应窗口+反应窗口无限加载器实现)
- app-engine-flexible - 通过 Terraform 脚本部署灵活的 Google App Engine(GAE) 时出错
- asp.net - 如何在asp.net的ascx中设置表格单元格数据?
- powershell - 在 Docker 容器中创建一对虚拟串行端口