你真的了解printf吗

1122d8a2385143b98c18a8cbcea3f705.png

511c2c721c0d4ce88b6e8b414166208b.jpeg

题目来源一位考研同学的题目。

第一眼:小子,这都不会😀
第二眼:wok,咋没有选项😢

        作为一个大一学C语音,大二学Java的同学来说,我一看就觉得肯定是11 6 11 6 。

        结果很遗憾,没有这个选项。

        我觉得不应该呀,于是我写了一段java代码跑了一次。


Java代码

dc93179ccbfb4216ad4a13eff111d44f.png

        还好,我天天睡觉没有睡到连JAVA都不会的地步,但是我毕竟也是大一学过C语音的,我明明记得i++是后自增。

        那到底是怎么回事,还是实现一下好了,由于之前一直学的C++而且我记得两个应该差不多,就输出几个数字而且,能有多大区别。


C++语言代码

0d7c3e30597940c689c0733dba8d0aeb.png

        我了个去,咋还是这样子,算了,还是老老实实写C吧。


C语音代码

0d535a727c71466894dd32857670413f.png

        这次就不一样了,后来我才知道,printf里面还有顺序的说法,大致就是从左往右来执行。具体为啥,请恕我才疏学浅,如果有大佬知道的话可以在评论区给我解答一下吗,感激不尽。

#include <stdio.h>

int main() {
    int i = 11, j = 6;
    printf("%d %d %d %d", i, j, i++, j++);
    // 1、 先运行了j++,此时由于是右自增,于是先显示了j的值,也就是6,然后j再自增了,此时j=7
    // 2、 第二个运行了i++,此时由于是右自增,于是先显示了i的值,也就是11,然后i再自增了,j=12
    // 3、 然后输出了j的值,也就是1第一步的7
    // 4、 最后输出了i的值,也就是12
    return 0;
}

        以上是我看了一些网上的资料给出的推测,所有我打算验证一下,看看是不是所谓的从右到左执行。

#include <stdio.h>

int main() {
    int i = 11, j = 6;
    printf("%d %d %d %d %d %d", i, j, i++, j++, ++i, ++j );
    return 0;
}

        如果刚刚的推断是正确的,那么结果应该是:13 8 12 7 12 7。

        那么还是老样子,看看运行结果

381d43c4ae7b448ba8189176598d5ba2.png

        

        沃趣,咋回事,咋又不对,我看看AI咋说。

89653ef6ef0a43aca273b7f6e29ab484.png

        到现在人更懵了,于是我试试更换GCC版本看看是否如同上面所说

a82c459a47b342df8496dd0e24918a11.png

7e0b47d5a1cb4748b3a10c9291c14760.png

00fdacf5751a4b2e9c4f47cb447258eb.png

f5cb20d5c6834d5ea5d343d7574f57b2.png

        好吧,综上所述,当编译器为Clang时,出现了不一样的结果,这个结果比较好接受一些,从左往右算了一遍。

        后面又搜了一下,计算是从右往左,输出是从左往右。

b15debef10014d9db016369ef373c026.png

        总是觉得只能看出个大概,不能明白到底是怎么回事。

66fa20840c5d45cea49153cacf175923.png

比如这个

  • i:最终值为 9(所有操作后的值)。
  • i++:在 i 增加到 9 之前为 8。
  • ++i:在 i 从 8 增加到 9 之后。
  • i++:在前面的操作之后为 6(操作后的值)。
  • ++i:最终值为 9(最后一次增加后的值)。

但是我总感觉这个解释并不好,不知道有没有大佬可以给我讲解一下呀!!!

a5c11e1b7c684e639dda4a5294bb5d9c.gif

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟解了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值