c - 使用逻辑运算符和前/后增量未从此代码获得预期输出
问题描述
我在以下 C 代码中没有得到预期的输出
main(){
int i=0,j=-2,k=0,m;
if((!i||--j&&k++)&&(i++||j++&&!k++))
{
printf("i=%d j=%d k=%d",i,j,k);
}
return 0;
}
我在编译器中得到了输出:
i=1 j=-1 k=1
但我不明白这里到底发生了什么。
我认为 if 语句不应该运行,因为它的论点是错误的
注意第一个括号 (!i||--j&&k++)
在这里,!i=1
因此这个括号是真的,因为在 OR 运算符下带有 1 的任何东西都是真的。
输出值变为: i=0, j=-3, k=1
现在注意第二个括号: (i++||j++&&!k++)
在这里我们有( 0 || -3 && !1) = 0, false
由于括号由 分隔&&
,if 语句的整个参数变为false
。
请解释我的论点在哪里是错误的。我是 C 新手
解决方案
逻辑 AND 运算符&&
和逻辑 OR 运算符||
是短路运算符,这意味着如果可以从左侧确定表达式的结果,则不会计算右侧。
所以当这个子表达式运行时:
(!i||--j&&k++)
解析为:
(!i||(--j&&k++))
左侧的||
评估结果为真,因此--j&&k++
不评估,这意味着 的值j
保持 -2, 的值k
保持 0。
所以最外面的左边&&
是真的,所以现在我们评估右边:
(i++||j++&&!k++)
解析为:
(i++||(j++&&!k++))
i
递增到 1,然后在 中使用旧值||
。旧值 0 评估为 false,因此评估右侧。 j
递增到 -1 并且 -2 的旧值评估为 true,因此评估 的右侧&&
。 k
递增到 1 并将旧值 0 应用于!
计算结果为 true 的运算符。这使得整个表达式为真并打印语句,此时i
为 1,j
为 -1,k
为 1。
推荐阅读
- r - 如何抑制来自“ggplot2”的警告消息
- git - 使用 Jenkins 在 Pipeline 中存储的凭据作为 git push 的 yml
- python - 如何在 Python 中安装 GTK 4
- laravel - 路线 laravel 未定义
- python - python请求模块请求参数编码的url与预期的url不同
- reactjs - 如何不在模式窗口中打开 PayPal,而是在 React 的新选项卡中打开
- spring-boot - 使用 Feign 构建器请求不会将 trace-id、span-id 发送到子客户端,但使用 rest 模板会显示子客户端上的所有标头
- r - 如何将数据仅连接到 R 中 {data.table} 的第一个匹配行
- python - 从库存中获取评论的服务器
- sql - 在父表上存储 1:N 关系中的特定列