前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >这行代码的打印结果确实让人迷惑!

这行代码的打印结果确实让人迷惑!

作者头像
编程珠玑
发布2020-10-27 10:49:25
4080
发布2020-10-27 10:49:25
举报
文章被收录于专栏:编程珠玑编程珠玑

来源:公众号【编程珠玑】

作者:守望先生

ID:shouwangxiansheng

上周在《来看一道"简单的"C语言面试题》中分享了一道题,所谓纠正后的代码也是漏洞百出,所幸读者在留言区已经指出,在这非常感谢。

今天再分享读者的代码。

有读者给出了类似这样的一段代码:

代码语言:javascript
复制
//来源:公众号【编程珠玑】
//作者:守望先生
#include <stdio.h>
int main(void)
{
    int i = 4;
    printf("%d\n%d\n%d\n%d\n",i,i+1,i++,i);
    return 0;
}

思考一下,打印结果会是什么?是不是以为结果如下:

代码语言:javascript
复制
4
5
4
5

实际输出

实际上,并非如此,输出结果如下:

代码语言:javascript
复制
5
6
4
5

为什么会是这样的结果? 首先,我们需要知道,通常来说(这里不是绝对),参数是按照从右往左顺序计算,然后入栈的,也就是说,对于cout来说,从右到左: i ,该位置参数值为i的值 i++,后置自增,先用再增,即得到4,该位置参数值为4,而i变为5 i+1,此时值为5+1=6,得到6,该位置参数值为6,i的值本身不变,即还是5 i,该位置参数值为i的值,即5。

因此,参数i的地方都为5,其他两个位置分别为6和4。

注意,这里i的值最终变为了5。

因此,从左到有,输出的值分别为5,6,4,5

总结

但是,对于同一个变量不同的操作在同一条语句中的写法是自找麻烦的。再举个简单的例子:

代码语言:javascript
复制
//来源:公众号【编程珠玑】
//作者:守望先生
#include<stdio.h>
int print(int a,int b)
{
    printf("a = %d b = %d",a,b);
}
int main(void)
{
    int a = 4;
    print(a++,a);
    return 0;
}

你可能会以上上面的代码输出4,4,然而并不是,它的输出是4,5。

关于这一点,我在《你可能不知道的printf》也有更多的描述。

所以,传入的参数,绝对不能依赖他们的计算顺序。拿本例来说,传入i++和i作为参数,无论计算顺序如何,都不应该影响最终结果,但是事实是,并非如此,因此导致了一个看起来很奇怪的结果。

再次强调!不要写这样的代码!不要写这样的代码!不要写这样的代码!

相关精彩推荐

想后台运行没想到导致磁盘满了

PIMPL:休想窥探我的隐私!

这才是现代C++单例模式简单又安全的实现

关注公众号【编程珠玑】,获取更多Linux/C/C++/数据结构与算法/计算机基础/工具等原创技术文章。后台免费获取经典电子书和视频资源

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程珠玑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实际输出
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档