欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

【C语言】C语言里++能随便用吗?

发布时间:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【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编译器下的运行结果:

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语言里++能随便用吗?的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。