鱼C论坛

 找回密码
 立即注册
查看: 1950|回复: 18

[已解决][新人求助];

[复制链接]
发表于 2022-3-31 10:13:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求大佬讲解下以下代码的运算逻辑...
#include<stdio.h>

void main()
{
int i=5;
int a=(++i)+(++i)+(++i);
printf("%d",a);
}

答案是22,如果a是4个、5个(++i)相加又是怎么样呢...
最佳答案
2022-3-31 10:42:54
柿子饼同学 发表于 2022-3-31 10:37
你可以看下这段代码的结果

  1.         i = 5;
  2.         // ++i 是先对 i 加一 , 然后再使用
  3.         a = (++i)  //i 先等于 5 , 然后给它加一 , 即 6 , 返回 , 所以这里++i = 6
  4.           + (++i)  //上面的时候i=6 , 所以先给它加一 , 即 7 , 返回 , 这里 ++i = 7
  5.           + (++i)  //同理 , 这里++i = 8
  6.           + (++i); //++i = 9
  7.           //所以整个式子就是 6+7+8+9 = 30
  8.           //++i的值会变, 是因为i是变量 , 前面改过它的值 , 它后面就会在改过的基础上算
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-3-31 10:21:14 From FishC Mobile | 显示全部楼层
史上最无聊的代码,没有之一
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-31 10:25:40 | 显示全部楼层
wp231957 发表于 2022-3-31 10:21
史上最无聊的代码,没有之一

啊...为什么
新人在看教程的时候看到的,一直没搞明白
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-31 10:35:42 | 显示全部楼层
wp231957 发表于 2022-3-31 10:21
史上最无聊的代码,没有之一

额 , 这种题竞赛最喜欢考了...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-31 10:36:29 | 显示全部楼层
Mrzhengdingwan 发表于 2022-3-31 10:25
啊...为什么
新人在看教程的时候看到的,一直没搞明白

++i 是先对 i 自增 1 , 然后再使用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-31 10:37:39 | 显示全部楼层
Mrzhengdingwan 发表于 2022-3-31 10:25
啊...为什么
新人在看教程的时候看到的,一直没搞明白
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4.         int i = 5;
  5.         int a = 0;
  6.         for(int k = 0; k < 5; k++){
  7.                 a += ++i;
  8.                 printf("%d\n", a);
  9.         }
  10.         return 0;
  11. }
复制代码

你可以看下这段代码的结果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-31 10:42:54 | 显示全部楼层    本楼为最佳答案   
柿子饼同学 发表于 2022-3-31 10:37
你可以看下这段代码的结果

  1.         i = 5;
  2.         // ++i 是先对 i 加一 , 然后再使用
  3.         a = (++i)  //i 先等于 5 , 然后给它加一 , 即 6 , 返回 , 所以这里++i = 6
  4.           + (++i)  //上面的时候i=6 , 所以先给它加一 , 即 7 , 返回 , 这里 ++i = 7
  5.           + (++i)  //同理 , 这里++i = 8
  6.           + (++i); //++i = 9
  7.           //所以整个式子就是 6+7+8+9 = 30
  8.           //++i的值会变, 是因为i是变量 , 前面改过它的值 , 它后面就会在改过的基础上算
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-3-31 11:33:28 | 显示全部楼层
Mrzhengdingwan 发表于 2022-3-31 10:25
啊...为什么
新人在看教程的时候看到的,一直没搞明白

话说你注意下 , 这个题目在不同编译系统里答案好像不一样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-31 11:39:30 | 显示全部楼层
柿子饼同学 发表于 2022-3-31 10:35
额 , 这种题竞赛最喜欢考了...

可问题是这类型的题目正确答案是什么?为什么?
  1. $ cat main.c
  2. #include <stdio.h>

  3. int main(void) {
  4.     int i = 5;
  5.     int a = (++i) + (++i) + (++i);
  6.     printf("%d\n", a);
  7.     return 0;
  8. }
  9. $ clang -g -Wall -o main main.c
  10. main.c:5:14: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
  11.     int a = (++i) + (++i) + (++i);
  12.              ^       ~~
  13. 1 warning generated.
  14. $ ./main
  15. 21
  16. $ gcc -g -Wall -o main main.c
  17. main.c: In function ‘main’:
  18. main.c:5:30: warning: operation on ‘i’ may be undefined [-Wsequence-point]
  19.     5 |     int a = (++i) + (++i) + (++i);
  20.       |                             ~^~~~
  21. main.c:5:30: warning: operation on ‘i’ may be undefined [-Wsequence-point]
  22. $ ./main
  23. 22
  24. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-31 11:41:22 | 显示全部楼层
clang给出的结果是21
gcc说这个代码输出22
我应该听谁的?为什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-31 11:42:44 | 显示全部楼层
为什么答案是22 ?
clang算错了?
为什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-31 12:26:59 From FishC Mobile | 显示全部楼层
兄弟,确实不用太纠结于其运算方式,只要明白基本道理,在代码上运用自如就没有问题了。
代码是死的,人是活的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-31 13:32:27 | 显示全部楼层
本帖最后由 柿子饼同学 于 2022-3-31 13:35 编辑
人造人 发表于 2022-3-31 11:42
为什么答案是22 ?
clang算错了?
为什么?


对呀 , 我手工算是 21 , 好像是不同优化之后出来结果不一样
也不知道为啥
但是根据他的逻辑 , 是21
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-31 13:35:03 | 显示全部楼层
人造人 发表于 2022-3-31 11:42
为什么答案是22 ?
clang算错了?
为什么?

https://www.zhihu.com/question/347864795
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-31 15:23:49 From FishC Mobile | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-3-31 15:25 编辑
人造人 发表于 2022-3-31 11:42
为什么答案是22 ?
clang算错了?
为什么?



哈哈,因为这点非常奇怪,所以我之前就一直上网爬文关于这点,我翻查到的答案是:其实 clang 和 gcc 都没有错,很奇怪吧?真正错的是程序员本身就不该这样编写代码,必须将其分成多行来写,一步一步执行。因为这有关“顺序点”和“副作用”的知识。 20A84D9E-9634-41B6-B04B-BF1EA96FB5BC.jpeg

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
人造人 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-3-31 20:06:12 | 显示全部楼层
柿子饼同学 发表于 2022-3-31 13:32
对呀 , 我手工算是 21 , 好像是不同优化之后出来结果不一样
也不知道为啥
但是根据他的逻辑 , 是21

这样的代码标准没有规定计算结果
不同的编译器有可能会给出不同的结果
在这里gcc和clang就给出了不同的结果

  1. warning: operation on ‘i’ may be undefined
复制代码

  1. warning: multiple unsequenced modifications to 'i'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-31 20:33:40 | 显示全部楼层
Mrzhengdingwan 发表于 2022-3-31 10:25
啊...为什么
新人在看教程的时候看到的,一直没搞明白

其实你可以用for循环的,这样简单啊。
  1. for (int i = 5; i <= 9;i ++){
  2.        a += i;    // a += i指 a = a + i
  3. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-31 22:43:38 | 显示全部楼层
人造人 发表于 2022-3-31 20:06
这样的代码标准没有规定计算结果
不同的编译器有可能会给出不同的结果
在这里gcc和clang就给出了不同的 ...

哎 , 怎么说呢 , 这玩意没有实际用处
但是他就喜欢考 , 知道这个规则就行了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-31 22:46:36 | 显示全部楼层
柿子饼同学 发表于 2022-3-31 22:43
哎 , 怎么说呢 , 这玩意没有实际用处
但是他就喜欢考 , 知道这个规则就行了

"出这种题的都该挨揍"
^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 17:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表