一.问题提出

在Blink区看到这么一个问题:

#include <stdio.h>int main() {int a = 3;printf("%d %d %d %d %d\n", a++, ++a, a++, ++a, a++);return 0;
}

运行结果(猜测):

3 5 5 7 7

最终a的值为8。

这看起来是一个美好的结果,但是这样是对的吗?
我们来看一看MinGW的gcc编译器下的运行结果:

7 8 5 8 3

下图为证:

确实如此,这个结果我测亲测,也与那位提问者提供的相符,但这使人很困惑是吧,我决心略微进行一下探究,讲出我的一些拙见。

二.最基本的情形的查看

  • 分别处理



  • 合起来简单处理


可见,将二者分开、不在同一个printf()里就会得到预期的结果,否则会出现“意外情况”。

三.对上述基本情况的分析研究

1.分别处理。

我们试着将一条语句拆成两行,按照不同的先后顺序执行,就得到了上面的结果。这证明单独运行不会出现预料之外的“异常情况”。

2.合起来简单处理。

把++放在printf()之外,得到我们原本预期的结果而非问题遇到的情况。这说明问题可能出在printf()里的多个++上(极有可能是编译问题)。

四.归纳分析

继续做测试,一步一步地增加测试:

上面的逐步归纳基本成型,我们可以设计另一个例子,进一步验证:

    int i = 1;printf("%d", (++i)+(++i));

上面代码运行结果是

6

可见gcc可能是这样工作的(资料引用):

++i;
++i;
i = i + i;
// ---> 6

五.得到结论

我不能说我很了解这里的知识,就只能说我根据实验归纳得到了下面的结论(仅限本问题):
输出序列中,++a对应的全是a的终值,a++对应的需要从右往左数依次是a、a+2、a+4、……

六.总结

这个问题本来觉得很有趣,跟一些大佬探讨了一下。
大佬们均并不建议我深究,说应该是C编译器的问题,更是有一位给了我上文中的链接,让我进一步体会到问题可能真的源自编译器。

也问了一位大学老师,给出的回复是:
(1)如果是在做选择题,建议跳过(实际上我并没有做选择题)。
(2)如果是写程序,建议避免这么使用(实际上我不喜欢使用)。

实际上,我确实不喜欢滥用++的代码,大量的++在我看来固然方便了编写简洁的代码但也降低了可读性,也可能由于某种疏漏引发没必要的Bug。

再讲讲问题本身。
看到这个问题我是比较头痛的,因为熟悉我的人可能知道,我是Python起步编程,Java正式学成体系的(比起各位大佬还是非常菜的),后面出于种种缘由才邂逅了各种美妙的编程语言。C语言我并非不懂,但也并不是我的强项,但还是觉得应该人有一种探究精神且不能过分拘泥于自己的舒适区,这也算我自己认定的一种自我追求与自我修养吧。

我现在随着理解的深入,有些问题已经不可避免的接触到我的痛点,想来也只能迎难而上、风雨无阻,谁叫我以作为一名进阶的Java码农为荣呢?(哈哈,Python真香)

如对本问题有更深的理解,可以留言,感谢。


2021-02-05更新

吐槽!

现在很多计算机的基础C教育往往把++这种东西看的太重,其实真的不好,我觉得这是在误导人。

我觉得编程学的比较不错的人不应该是背书背代码背规则的庸才,能流畅地编程并快速的学会一样新鲜的技术的人是更好的,可惜……

之前就有什么i+++++i之类的睿智代码,吐了……无语子……

比如下面这种代码,常考,要是你自己整天写这种代码的话,呵呵,纯属给自己惹麻烦。

#include <stdio.h>int main ( )
{int a,b,k;k=(a=2,b=5,a>b?a++:b++,a+b);printf("k = %d\n", k);
}

【C语言】C语言里++能随便用吗?相关推荐

  1. c语言显示格式错误,C语言,输出里多空格,提交格式错误,怎么改下

    C语言,输出里多空格,提交格式错误,怎么改下 答案:2  信息版本:手机版 解决时间 2020-04-13 03:37 已解决 2020-04-12 07:12 输入n ,然后输入n个字符串,是制定的 ...

  2. 为什么我们需要一门新语言——Go语言

    编程语言已经非常多,偏性能敏感的编译型语言有 C.C++.Java.C#.Delphi和Objective-C等,偏快速业务开发的动态解析型语言有 PHP.Python.Perl.Ruby.JavaS ...

  3. 脚本语言语言脚本语言:Shell , JavaScript、VBScript、Perl、PHP、Python、Ruby、Lua

    今天一直在研究脚本语言语言之类的问题,上午正好有机会和大家共享一下. 脚本语言:Shell , JavaScript.VBScript.Perl.PHP.Python.Ruby.Lua 工作控制语言和 ...

  4. C语言 | C语言深度解剖 ——章节2 符号

    C语言 | C语言深度解剖 --章节2 符号 C语言基本符号表 注释符号 // /* 几个似非而是的注释问题 y=x/*p 出色注释的基本要求 连接符和转义符 \ 单引号.双引号 花括号 运算符 10 ...

  5. 软件设计师:06-程序设计语言与语言处理程序基础

    章节 章节 01 - 计算机组成原理与体系结构 07 - 法律法规与标准化与多媒体基础 02 - 操作系统基本原理 08 - 设计模式 03 - 数据库系统 09 - 软件工程 04 - 计算机网络 ...

  6. OSChina 周二乱弹 —— 开发语言和语言开发的能一样么

    Osc乱弹歌单(2019)请戳(这里) [今日歌曲] @花间小酌:#今日歌曲推荐# 分享The Score的单曲<Revolution> <Revolution>- The S ...

  7. 手把手入门C语言—C语言指针

    手把手入门C语言-C语言指针 指针前言 什么是指针? 指针的长度 指针的深入理解 四个小实验 int i = 123;int* p; p = &i; 理解指针 1.指针和指针变量的关系 2.为 ...

  8. 倒计时报警器c语言程序,求助,c语言c语言倒计时小程序

    求助,c语言c语言倒计时小程序 (2012-04-20 20:11:33) 标签: 杂谈 这个和你自己的电脑掉线和系统有关系吗.我以前的电脑也怀孕可以玩电脑吗,自从买了这个双核新电脑怎么装系统之后就怎 ...

  9. android多语言适配--语言对应的资源文件夹名称

    android多语言适配--语言对应的资源文件夹名称 众所皆知.Android开发中,res资源文件夹下,可以根据不同的文件名后缀(连接符(-)加限定符)来区别不同的资源. android在运行时使用 ...

  10. 数据结构c语言java语言差别,C语言和JAVA有什么区别?

    去百度文库,查看完整内容> 内容来自用户:天涯教育 java和c语言的区别是什么 什幺是java Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点, 还摒弃了C++里难以理解的多继 ...

最新文章

  1. 实现Java中的ArrayList
  2. 设计模式(五)责任链模式
  3. Ethernet/IP 学习笔记四
  4. 大会直击|微软亚洲研究院刘铁岩:深度学习成功的秘密
  5. php tp5 redis的使用(亲测)
  6. Myeclipse2013下载,安装,破解,介绍(CSDN首发)
  7. 响应文件是不是标书_什么是标书?投标书有哪些分类?标书和投标书的不同?...
  8. 数据结构栈和队列以及常见算法题
  9. 斯坦福NLP组最新报告:自然语言处理中的学习挑战(附149页报告全文下载
  10. 年度总结 是不公平和智障的产物
  11. JAVA版开源微信管家—JeeWx捷微3.1小程序版本发布,支持微信公众号,微信企业号,支付窗
  12. php pdo mysql类源码_完整示例php+pdo实现的购物车类
  13. BZOJ4141 THUSC2013 魔塔 贪心
  14. C# TextBox光标位置设置 滚动到最后一行 显示最后一行 自动跳转最后一行
  15. 今日头条引流小白入门视频解析下载支持今日头条快手抖音视频去水印软件批量处理去重消重去水印去logo...
  16. C++SOCKET面试题附答案
  17. 右键后资源管理器重启
  18. Quitting an application - is that frowned upon?
  19. 1dB增益压缩点概述及测试
  20. Greenplum【部署 04】GPSS扩展安装并使用GPKafka实现Kafka数据导入Greenplum数据库(安装包网盘分享)

热门文章

  1. 使用 js 设置组合快捷键,支持多个组合键定义,还支持 React
  2. Git 下载、安装与SSH配置
  3. 从此走上一条iOS程序猿不归路。。。
  4. 表示探索、探究的几个词
  5. TechEd 2007 HOL分享
  6. [导入]C#实现WEB浏览器
  7. python字符串数组_python将字符串转换成数组的方法
  8. 隧道不能访问web vxaln_SpringBoot实现本地存储文件上传及提供HTTP访问服务
  9. 计算机组装虚拟实验,组装计算机的虚拟实验室
  10. oracle 关闭数据库实列,Oracle 11g 数据库启动和关闭