c语言++运算符的详细执行步骤,运算的和书籍的结果不一...

2020-01-30 13:59发布

本帖最后由 未来电子 于 2013-3-26 19:32 编辑

        int p,q,i,j;
        i=j=3;
        q=0;
        q=++j
        printf("%d,",q);
这时候的运算的值是4,
          int p,q,i,j;
        i=j=3;
        q=0;
        q=(++j)+(++j);
        printf("%d,",q);
这时候的运算的值是10,
          int p,q,i,j;
        i=j=3;
        q=0;
        q=(++j)+(++j)+(++j);
        printf("%d,",q);
这时候的运算的值是16,
第二个结果就不明白了,会的解释一下
软件换过好几个都是这个情况。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
dr2001
1楼-- · 2020-02-01 09:16
本帖最后由 dr2001 于 2013-3-26 14:30 编辑
whyjld 发表于 2013-3-26 13:21
你根本不明白我说的
C的的表达式求值顺序是定义好的,根据运算符优先级和结合顺序计算,各个C编译器必须 ...


(WG14 N1256) C99标准,6.5-2,是我知道的关于类似问题的唯一规定:
Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. 72) Furthermore, the prior value shall be read only to determine the value to be stored. 73)

如果基于这个条款理解,q = (++j) + (++j) + (++j)由于不满足前半句的要求,因而执行完毕后的结果是Undefined,即啥结果都可能,包含表达式q的值和j的值都是不定的。C标准在这里没有保障任何东西。

当然,详细讨论这货没啥意思。。。
rookies
2楼-- · 2020-02-01 12:48
你连程序都没抄对,看起来太乱好好的理一下,你定义一个数,就是在内存中弄一个单元,然后存起来。你要对这个内存单元操作,那么++ 几次 最后处理加起来不就完了,你认为编译器会那么笨弄一个中转!printf 少用,DEBUG 看看 内存中,数据是什么样的,不行就看看反汇编是如何实现的。
未来电子
3楼-- · 2020-02-01 15:27
whyjld 发表于 2013-3-26 09:09
在实际的代码中写这种表达式就是发疯。
C标准中没有没有明确的规定(++j)+(++j)在中间那个+直行的时候j到底 ...

谢谢好像明白一点
未来电子
4楼-- · 2020-02-01 20:19
rookies 发表于 2013-3-26 14:35
你连程序都没抄对,看起来太乱好好的理一下,你定义一个数,就是在内存中弄一个单元,然后存起来。你要对这 ...

恩、
你的方法我没有试过
未来电子
5楼-- · 2020-02-01 21:53
 精彩回答 2  元偷偷看……
hhxb
6楼-- · 2020-02-02 02:15
本帖最后由 hhxb 于 2013-3-26 21:54 编辑

中国人长期受应试教育的荼毒,形成了错误思维定势
我看过一本书讲过这类问题,
详细区分了三种情况。 未规定,由编译器自己去确定,编译器个不一样;
                  不确定,某家编译器自己制定的标准,所有版本均一直。
                  未知,编译器的前后版本也不一致;

                  

一周热门 更多>