【C语言】C语言里++能随便用吗?
一.问题提出
在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编译器下的运行结果:
下图为证:
确实如此,这个结果我测亲测,也与那位提问者提供的相符,但这使人很困惑是吧,我决心略微进行一下探究,讲出我的一些拙见。
二.最基本的情形的查看
- 分别处理
- 合起来简单处理
可见,将二者分开、不在同一个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语言里++能随便用吗?的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 质因数分解(洛谷P1075题题解,Jav
- 下一篇: 搞了多年管理软件,总算说清楚了什么是好软