免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: mytch
打印 上一主题 下一主题

关于++运算的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2004-08-26 13:39 |只看该作者

关于++运算的问题

C/C++标准规定了运算符的功能和结合性。运算符的结合性决定了同级运算时的运算顺序。例如:对于表达式 a - b + c,+、-为同级运算符,左结合,因此它的运算顺序为 (a - b) + c,即先计算 a - b 的值,然后再与 c 相加。这个运算顺序对于任何的C/C++编译器都是一致的。

问题是:C/C++标准没有规定操作数运算的先后顺序。这也就是说,对于上面的表达式,操作数 a、b 和 c 的计算顺序是不固定的。其原因在于:每个编译器采取的计算操作数顺序不同。对于同级运算,有的从左到右,有的与此相反;a、b、c的计算顺序也可能受到各自表达式中运算符的优先级的影响。

表达式或者操作数的结果不应该倚赖于表达式中操作数计算的先后顺序。

例外情况是:&&、||、?: 和 ,。对于它们,C/C++标准明确规定了操作数的计算先后顺序。例如:对于a && b,一定是先计算 a,然后根据 a 的结果决定是否再计算 b。对于这些特殊情况,应该与一般情况加以区分。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
12 [报告]
发表于 2004-08-26 14:02 |只看该作者

关于++运算的问题

怎么我觉得不管操作数的计算顺序如何结果都应该是9呀?
因为它用了括号呀.
iTest=(++iCounter)+(++iCounter)+(++iCounter);
不管是先计算哪个括号,那iCounter都是先加1呀.然后变成2的.会有什么影响呢?
这三个带括号的表达式虽然都互相依赖,但最终的依赖是在iCounter的值上面.它参考的是iCounter而不是哪个表达式呀.怎么理解?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
13 [报告]
发表于 2004-08-26 14:05 |只看该作者

关于++运算的问题

但你怎么知道它是先计算完所有的操作数在来计算运算符啊?这个也没有规定啊?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
14 [报告]
发表于 2004-08-26 14:09 |只看该作者

关于++运算的问题

[quote]原帖由 "aero"]但你怎么知道它是先计算完所有的操作数在来计算运算符啊?这个也没有规定啊?[/quote 发表:
谁说了先计算完所有的操作数?直接点吧,12怎么得来?随便一种实现.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
15 [报告]
发表于 2004-08-26 14:13 |只看该作者

关于++运算的问题

可以算完第一个,当它等于2的时候运算加法,而这个时候就不知道第二个操作数也是2,还是还要算++,是3?

其实,这些都是取决与编译器的,怎么说都是有道理的。事实上也没有人这么写程序啊。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
16 [报告]
发表于 2004-08-26 14:20 |只看该作者

关于++运算的问题

既然你说第一个括号先计算,那等第一个括号算完了iCounter的值不就自然就是2了吗?然后你运算加法你就要去计算第二个括号,当然要先计算++,而当前的iCounter已经是2了,那就变成3了...这个编译器都不确定吗?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
17 [报告]
发表于 2004-08-26 14:23 |只看该作者

关于++运算的问题

好,那么前面就是2+3了。这是一个方式。
那么还可能编译器在计算运算符之前计算所有的操作数。
就有可能在运算+之前就计算了3个++,那么就是4+4+4了,不就是12了?

标准没有规定,怎么都有可能的。所以说这是个没有意义的问题。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
18 [报告]
发表于 2004-08-26 17:17 |只看该作者

关于++运算的问题

哇,3个++也可以同时算哪?还可以同时得到4啊?
1>;最起码也要一个一个来吧,后面的总是用前面的iCounter.
2>;有括号怎么可能这样呢?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
19 [报告]
发表于 2004-08-26 17:22 |只看该作者

关于++运算的问题

你不相信也就算了。总之,标准里没有规定的事情,编译器要怎么做都可以。
你可以看看CU里以前讨论这个问题的帖子。有过好多。
编译器的优化更是让你迷糊呢!有些程序,优化后的性能不及优化前的,你怎么解释。编译器始终都是死的,只有人是活的。要想仔细了解细节就要去看编译器的源码,看汇编出来的汇编代码,不是干想就能得到答案的。

论坛徽章:
0
20 [报告]
发表于 2004-08-26 18:11 |只看该作者

关于++运算的问题

在楼主程序的基础上增加了一点变化。如果你能从其“混乱”的运行结果中看出点什么,也就达到我的目的了。


  1. #include <stdio.h>;

  2. int main()
  3. {
  4.   int i;
  5.   float f;

  6.   i = 1;
  7.   printf("%d\n", ++i + ++i + ++i);
  8.   i = 1;
  9.   printf("%d\n", (++i + ++i) + ++i);
  10.   i = 1;
  11.   printf("%d\n", ++i + (++i + ++i));

  12.   f = 1.0;
  13.   printf("%f\n", ++f + ++f + ++f);
  14.   f = 1.0;
  15.   printf("%f\n", (++f + ++f) + ++f);
  16.   f = 1.0;
  17.   printf("%f\n", ++f + (++f + ++f));
  18. }
复制代码

当然,各个编译器可能得到不同的结果。我用GCC 3.4.0编译后的运行结果如下:
10
10
12
9.000000
9.000000
9.000000
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP