编译器问题 printf 从右向左执行的!
哎~! 看你没专心听讲吧!
printf着重强调 printf中最好不要放表达式! 要有确定的值!
楼主 我已经测试了答案 如果按照你的想法的话
先把表达式的值求出来 输出的应该是9889
因为最后一个 i-- 输出结束后才进行 “--”的 !明白没有。。
而你的编译器是从右向左计算表达式值。先计算的是i-- 那i的值就肯定不一样了嘛!在颜晖老师的课上 一而在再而三的强调 i-- 这个表达式的值 跟i变量的值不一样! 大部分编译器都这样 所以答案是8778 如果你是设定好的要这样的值 那当然没错啦。。如果你不知道这种情况。那答案肯定事错的啦!
清楚没有!
老师有没有讲。有讲嘛! 你有没有在听啊。没有嘛!
上课记得专心听讲。 不明白在HI 我!
==========================================================================
以下内容引自《C 语言常见问题集》 原著:Steve Summit 翻译:朱群英, 孙 云
http://c-faq-chn.sourceforge.net/ccfaq/index.html
http://www.eskimo.com/~scs/C-faq/top.html
==========================================================================
4.3 对于代码 int i = 3; i = i++; 不同编译器给出不同的结果, 有的为 3, 有的为 4, 哪个是正确的?
没有正确答案;这个表达式无定义。参见问题 3.1, 3.7 和 11.32。 同时注意, i++ 和 ++i 都不同于 i+1。如果你要使 i 自增 1, 使用 i=i+1, i+=1, i++ 或 ++i, 而不是任何组合, 参见问题 3.10。
12.35 有人说 i = i++ 的行为是未定义的, 但是我刚在一个兼容 ANSI 的编译器上测试, 得到了我希望的结果。
面对未定义行为的时候, 包括范围内的实现定义行为和未确定行为, 编译器可以做任何实现, 其中也包括你所有期望的结果。但是依靠这个实现却不明智。参加问题 7.4, 11.31, 11.32 和 11.34。
4.2 使用我的编译器,下面的代码 int i=7; printf("%d\n", i++ * i++); 返回 49?不管按什么顺序计算, 难道不该打印出56吗?
尽管后缀自加和后缀自减操作符 ++ 和 -- 在输出其旧值之后才会执行运算, 但这里的``之后"常常被误解。没有任何保证确保自增或自减会在输出变量原值之后和对表达式的其它部分进行计算之前立即进行。也不能保证变量的更新会在表达式 ``完成" (按照 ANSI C 的术语, 在下一个 ``序列点" 之前, 参见问题 3.7) 之前的某个时刻进行。本例中, 编译器选择使用变量的旧值相乘以后再对二者进行自增运算。
包含多个不确定的副作用的代码的行为总是被认为未定义。(简单而言, ``多个不确定副作用" 是指在同一个表达式中使用导致同一对象修改两次或修改以后又被引用的自增, 自减和赋值操作符的任何组合。这是一个粗略的定义; 严格的定义参见问题 3.7, ``未定义" 的含义参见问题 11.32。) 甚至都不要试图探究这些东西在你的编译器中是如何实现的 (这与许多 C 教科书上的弱智练习正好相反); 正如 K&R 明智地指出, ``如果你不知道它们在不同的机器上如何实现, 这样的无知可能恰恰会有助于保护你。
4.7 我怎样才能理解复杂表达式?``序列点" 是什么?
序列点是一个时间点(在整个表达式全部计算完毕之后或在 ||、 &&、 ? : 或逗号 运算符处, 或在函数调用之前), 此刻尘埃落定, 所有的副作用都已确保结束。 ANSI/ISO C 标准这样描述:
在上一个和下一个序列点之间, 一个对象所保存的值至多只能被表达式的计算修改一次。而且前一个值只能用于决定将要保存的值。
第二句话比较费解。它说在一个表达式中如果某个对象需要写入, 则在同一表达式中对该对象的访问应该只局限于直接用于计算将要写入的值。这条规则有效地限制了只有能确保在修改之前才访问变量的表达式为合法。例如 i = i+1 合法, 而 a[i] = i++ 则非法 (参见问题 3.1)。
参见下边的问题 3.8。
前两个不太清楚,后两个是这样的:因为开始是整形i=8,直接输出i++或i--的话还是8,如果下面还有程序或是循环的话,则是按9往下算,直接输出则不变,所以后两个都是8,我认为前两个应该是9和7才对,如果结果是8788我也不知道了,呵呵,希望能帮到你。
++是自增运算符~放在数字前面和后面意义不一样
放之前表示先增数值再使用参与运算
++i是9
--i是7
放在后面就是先使用数值再增值 所以
i++和i--都是8
我算的是8778,也差一个数。