来源:公众号【编程珠玑】
作者:守望先生
ID:shouwangxiansheng
上周在《来看一道"简单的"C语言面试题》中分享了一道题,所谓纠正后的代码也是漏洞百出,所幸读者在留言区已经指出,在这非常感谢。
今天再分享读者的代码。
有读者给出了类似这样的一段代码:
//来源:公众号【编程珠玑】
//作者:守望先生
#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;
}
思考一下,打印结果会是什么?是不是以为结果如下:
4
5
4
5
实际上,并非如此,输出结果如下:
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
但是,对于同一个变量不同的操作在同一条语句中的写法是自找麻烦的。再举个简单的例子:
//来源:公众号【编程珠玑】
//作者:守望先生
#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作为参数,无论计算顺序如何,都不应该影响最终结果,但是事实是,并非如此,因此导致了一个看起来很奇怪的结果。
再次强调!不要写这样的代码!不要写这样的代码!不要写这样的代码!
相关精彩推荐
关注公众号【编程珠玑】,获取更多Linux/C/C++/数据结构与算法/计算机基础/工具等原创技术文章。后台免费获取经典电子书和视频资源