[新人求助];
求大佬讲解下以下代码的运算逻辑...#include<stdio.h>
void main()
{
int i=5;
int a=(++i)+(++i)+(++i);
printf("%d",a);
}
答案是22,如果a是4个、5个(++i)相加又是怎么样呢... 史上最无聊的代码,没有之一 wp231957 发表于 2022-3-31 10:21
史上最无聊的代码,没有之一
啊...为什么
新人在看教程的时候看到的,一直没搞明白 wp231957 发表于 2022-3-31 10:21
史上最无聊的代码,没有之一
额 , 这种题竞赛最喜欢考了... Mrzhengdingwan 发表于 2022-3-31 10:25
啊...为什么
新人在看教程的时候看到的,一直没搞明白
++i 是先对 i 自增 1 , 然后再使用 Mrzhengdingwan 发表于 2022-3-31 10:25
啊...为什么
新人在看教程的时候看到的,一直没搞明白
#include <bits/stdc++.h>
using namespace std;
int main(){
int i = 5;
int a = 0;
for(int k = 0; k < 5; k++){
a += ++i;
printf("%d\n", a);
}
return 0;
}
你可以看下这段代码的结果 柿子饼同学 发表于 2022-3-31 10:37
你可以看下这段代码的结果
i = 5;
// ++i 是先对 i 加一 , 然后再使用
a = (++i)//i 先等于 5 , 然后给它加一 , 即 6 , 返回 , 所以这里++i = 6
+ (++i)//上面的时候i=6 , 所以先给它加一 , 即 7 , 返回 , 这里 ++i = 7
+ (++i)//同理 , 这里++i = 8
+ (++i); //++i = 9
//所以整个式子就是 6+7+8+9 = 30
//++i的值会变, 是因为i是变量 , 前面改过它的值 , 它后面就会在改过的基础上算 Mrzhengdingwan 发表于 2022-3-31 10:25
啊...为什么
新人在看教程的时候看到的,一直没搞明白
话说你注意下 , 这个题目在不同编译系统里答案好像不一样
柿子饼同学 发表于 2022-3-31 10:35
额 , 这种题竞赛最喜欢考了...
可问题是这类型的题目正确答案是什么?为什么?
$ cat main.c
#include <stdio.h>
int main(void) {
int i = 5;
int a = (++i) + (++i) + (++i);
printf("%d\n", a);
return 0;
}
$ clang -g -Wall -o main main.c
main.c:5:14: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
int a = (++i) + (++i) + (++i);
^ ~~
1 warning generated.
$ ./main
21
$ gcc -g -Wall -o main main.c
main.c: In function ‘main’:
main.c:5:30: warning: operation on ‘i’ may be undefined [-Wsequence-point]
5 | int a = (++i) + (++i) + (++i);
| ~^~~~
main.c:5:30: warning: operation on ‘i’ may be undefined [-Wsequence-point]
$ ./main
22
$
clang给出的结果是21
gcc说这个代码输出22
我应该听谁的?为什么?
为什么答案是22 ?
clang算错了?
为什么?
兄弟,确实不用太纠结于其运算方式,只要明白基本道理,在代码上运用自如就没有问题了。
代码是死的,人是活的 本帖最后由 柿子饼同学 于 2022-3-31 13:35 编辑
人造人 发表于 2022-3-31 11:42
为什么答案是22 ?
clang算错了?
为什么?
对呀 , 我手工算是 21 , 好像是不同优化之后出来结果不一样
也不知道为啥
但是根据他的逻辑 , 是21 人造人 发表于 2022-3-31 11:42
为什么答案是22 ?
clang算错了?
为什么?
https://www.zhihu.com/question/347864795 本帖最后由 傻眼貓咪 于 2022-3-31 15:25 编辑
人造人 发表于 2022-3-31 11:42
为什么答案是22 ?
clang算错了?
为什么?
{:10_257:}
哈哈,因为这点非常奇怪,所以我之前就一直上网爬文关于这点,我翻查到的答案是:其实 clang 和 gcc 都没有错,很奇怪吧?真正错的是程序员本身就不该这样编写代码,必须将其分成多行来写,一步一步执行。因为这有关“顺序点”和“副作用”的知识。 柿子饼同学 发表于 2022-3-31 13:32
对呀 , 我手工算是 21 , 好像是不同优化之后出来结果不一样
也不知道为啥
但是根据他的逻辑 , 是21
这样的代码标准没有规定计算结果
不同的编译器有可能会给出不同的结果
在这里gcc和clang就给出了不同的结果
warning: operation on ‘i’ may be undefined
warning: multiple unsequenced modifications to 'i' Mrzhengdingwan 发表于 2022-3-31 10:25
啊...为什么
新人在看教程的时候看到的,一直没搞明白
其实你可以用for循环的,这样简单啊。
for (int i = 5; i <= 9;i ++){
a += i; // a += i指 a = a + i
}
人造人 发表于 2022-3-31 20:06
这样的代码标准没有规定计算结果
不同的编译器有可能会给出不同的结果
在这里gcc和clang就给出了不同的 ...
哎 , 怎么说呢 , 这玩意没有实际用处
但是他就喜欢考 , 知道这个规则就行了{:10_266:} 柿子饼同学 发表于 2022-3-31 22:43
哎 , 怎么说呢 , 这玩意没有实际用处
但是他就喜欢考 , 知道这个规则就行了
"出这种题的都该挨揍"
^_^
页:
[1]