标题:关于++x的问题求教
只看楼主
niuyoude
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2019-10-21
结帖率:0
已结贴  问题点数:20 回复次数:4 
关于++x的问题求教
#include <stdio.h>
int main(void)
{
    int x=5;
    int n,m,l;
    l=(++x)+(++x)+(++x);
    n=(++x)+(++x);
    m=(--x)+(--x);
    printf("%d\n%d\n%d\n",l,n,m);
    return 0;
}
上面的程序,输出结果是22,20,16。有点不理解,求指点。
搜索更多相关主题的帖子: return 结果 printf int 输出 
2019-10-24 15:39
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
你这是未定义行为(undefined behavior),就是C标准认为没有任何理由存在,对此没有任何规定的行为。比如 数组越界访问 等等就属于未定义行为。

打个预防针:任何给你解释为什么结果是什么什么,或 让你/给你看汇编的,都是分不清 未定义行为(undefined behavior)实现定义行为(implementation-defined behavior) 区别的渣滓
2019-10-24 16:00
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
你可以看看 https://zh. 最后面的例子
1) 若对一个标量对象的副效应与另一个对同一标量对象的副效应相对无顺序,则行为未定义。
  i = ++i + i++; // 未定义行为
  i = i++ + 1; // 未定义行为
  f(++i, ++i); // 未定义行为
  f(i = -1, i = -1); // 未定义行为

2) 若一个标量对象上的副效应与另一个使用同一标量对象之值的值计算相对无顺序,则行为未定义。
  f(i, i++); // 未定义行为
  a[i] = i++; // 未定义行为

3) 只要至少一个子表达式的排序容许这种无顺序副效应,就应用上述规则。

收到的鲜花
  • c小白23332019-10-24 21:47 送鲜花  5朵  
2019-10-24 16:16
c小白2333
Rank: 5Rank: 5
来 自:中国
等 级:贵宾
威 望:11
帖 子:121
专家分:367
注 册:2019-6-17
得分:10 
回复 3楼 rjsp
前辈
是不这类未定义的程序本身就有问题
所以相当于一个错误的程序 所以他的结果是反逻辑的
不用考虑上面所说的“为什么得出结果, 怎样得出结果”之类的傻问题
所以只要知道这类错误
并且在使用时避免它的出现,就可以了

宝剑锋从磨砺出,梅花香自苦寒来。
2019-10-24 21:44
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 4楼 c小白2333
未定义行为 基本上都是没法作规定的行为,比如 数组越界 等等。当然,也不是绝对没办法,只是代价太大,得不偿失而已。
而 ++i + ++i 之所以规定为 未定义行为,是因为“代码优化”,要“代码优化”的话,编译器必须作出一定的假设,比如不对同一个变量多次读读写写,否则不敢优化,每次优化结果不一样怎么行。
当然了,这也不是绝对的,如果某天C标准规定 ++i + ++i 不再是未定义行为的话,也不奇怪。

在目前,++i + ++i 是未定义行为的状态下,编译器从未考虑过这种状况该怎么办,那么出现任何结果都是可能的。如果出现符合作者期望的结果,那只能算是巧合而已,而不是必然。比如gcc的某个版本曾遇到 ++i + ++i 就自动启动一个游戏,这恶作剧式的行为是符合C标准规定的。

2019-10-25 08:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-497420-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.051196 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved