这行代码的打印结果确实让人迷惑!
时间:2022-07-28
本文章向大家介绍这行代码的打印结果确实让人迷惑!,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
来源:公众号【编程珠玑】
作者:守望先生
ID:shouwangxiansheng
上周在《来看一道"简单的"C语言面试题》中分享了一道题,所谓纠正后的代码也是漏洞百出,所幸读者在留言区已经指出,在这非常感谢。
今天再分享读者的代码。
有读者给出了类似这样的一段代码:
//来源:公众号【编程珠玑】
//作者:守望先生
#include <stdio.h>
int main(void)
{
int i = 4;
printf("%dn%dn%dn%dn",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++/数据结构与算法/计算机基础/工具等原创技术文章。后台免费获取经典电子书和视频资源
- Java基础-07(02).总结private,this,封装,static,成员方法变量,局部变量匿名对象
- 通过shell脚本快速定位active session问题(r4笔记第65天)
- 01 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之业务分析与DAO层
- JSP第六篇【自定义标签之传统标签】
- 过滤器监听器面试题都在这里
- 02 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之Service层
- JSP第五篇【JSTL的介绍、core标签库、fn方法库、fmt标签库】
- java中的序列化 (r4笔记第64天)
- JSP第四篇【EL表达式介绍、获取各类数据、11个内置对象、执行运算、回显数据、自定义函数、fn方法库】
- 03 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之web层
- JSP第三篇【JavaBean的介绍、JSP的行为--JavaBean】
- Java基础-06.总结二维数组,面向对象
- 04 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之高并发优化
- 过滤器第一篇【介绍、入门、简单应用】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法