| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 13016 人关注过本帖
标题:q=(++j)+(++j)+(++j)怎么运算?
只看楼主 加入收藏
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
包含多个不确定的副作用的代码的行为总是被认为未定义。(简单而言, “多个不确定副作用”是指在同一个表达式中使用导致同一对象修改两次或修改以后又被引用的自增,自减和赋值操作符的任何组合。这是一个粗略的定义。) 甚至都不要试图探究这些东西在你的编译器中是如何实现的 (这与许多 C 教科书上的弱智练习正好相反)。正如 K&R 明智地指出”如果你不知道它们在不同的机器上如何实现, 这样的无知可能恰恰会有助于保护你”。

那么,所谓的序列点是什么意思呢?

序列点是一个时间点(在整个表达式全部计算完毕之后或在 ||、 &&、 ? : 或逗号 运算符处, 或在函数调用之前), 此刻尘埃落定,所有的副作用都已确保结束。 ANSI/ISO C 标准这样描述:

在上一个和下一个序列点之间,一个对象所保存的值至多只能被表达式的计算修改一次。而且前一个值只能用于决定将要保存的值。

第二句话比较费解。它说在一个表达式中如果某个对象需要写入, 则在同一表达式中对该对象的访问应该只局限于直接用于计算将要写入的值。这条规则有效地限制了只有能确保在修改之前才访问变量的表达式为合法。

例如 i = i+1 合法,而 a[i] = i++ 则非法。为什么这样的代码:a[i] = i++; 不能工作?子表达式 i++ 有一个副作用 — 它会改变 i 的值 — 由于 i 在同一表达式的其它地方被引用,这会导致无定义的结果,无从判断该引用(左边的 a[i] 中)是旧值还是新值。那么,对于 a[i] = i++; 我们不知道 a[] 的哪一个分量会被改写,但 i 的确会增加 1,对吗?

不一定!如果一个表达式和程序变得未定义,则它的所有方面都会变成未定义。

为什么&& 和 || 运算符可以产生序列点呢?这些运算符在此处有一个特殊的例外:如果左边的子表达式决定最终结果 (即,真对于 || 和假对于 && ) ,则右边的子表达式不会计算。因此,从左至右的计算可以确保,对逗号表达式也是如此。而且,所有这些运算符 (包括 ? : ) 都会引入一个额外的内部序列点。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-06-16 04:14
liyingxzy
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2008-06-16 10:34
liuww
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-6-16
收藏
得分:0 
回复 1# zkt0422 的帖子
用的TC2.0;答案为:24
可能编译器不同答案也不同吧


#include <stdio.h>
int main()
{ int q=0,j=5;
  q=(++j)+(++j)+(++j);
  printf("%d",q);

  return 0;
}

[[it] 本帖最后由 liuww 于 2008-6-16 11:09 编辑 [/it]]
2008-06-16 11:07
lai832
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-6-10
收藏
得分:0 
Dev-C++
也是22
2008-06-16 12:52
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
收藏
得分:0 
这种问题没讨论的必要吧.....

樱花大战,  有爱.
2008-06-16 13:14
chenji992
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-1-12
收藏
得分:0 
回复 5楼 Kid_X
为什么是7+7+8,有没有更进一步的5答案呢?
2010-01-13 18:06
晨光嫣然
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-12-10
收藏
得分:0 
结果很好!很准确!赞一个!新手报到!
2012-12-10 23:16
Kandy凯
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2020-4-6
收藏
得分:0 
回复 3楼 wangzhuzhen
不对不对,编译结果是22.但是有些编译器是24,反正肯定不是21.
2020-04-06 16:29
xxx0123
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2023-2-14
收藏
得分:0 
回复 6楼 C王之王
请假一下,为什么是7+7,而不是6+7?
2023-02-14 08:27
快速回复:q=(++j)+(++j)+(++j)怎么运算?
数据加载中...
 
   



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

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