以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 编程心得 』   (http://bbs.xml.org.cn/list.asp?boardid=42)
----  向高手请教一道程序题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=42&rootid=&id=39110)


--  作者:飞鹰战士
--  发布时间:10/19/2006 8:39:00 PM

--  向高手请教一道程序题
在VC++ 下

main()
{
   int i=2;
   printf("%d",(++i)+(++i)+(++i));
}

输出的结果为什么是 13 ?


--  作者:wcdxyl
--  发布时间:10/20/2006 10:33:00 AM

--  
?绝对是12吧。
int i=2;
printf("%d",(++i)+(++i)+(++i));
-》3+4+5
-》12
--  作者:longshentailang
--  发布时间:10/20/2006 12:00:00 PM

--  
结果是15。我在『 C/C++编程思想 』栏目里说明了理由。
--  作者:lanmaozi
--  发布时间:10/20/2006 10:35:00 PM

--  
编译环境不同,结果也不同的啊~~~

每个编译器有自己定义的运算顺序点,I是每个表达式计算后增加还是在整个表达式计算后增加,由编译器决定~~~~~~


--  作者:longshentailang
--  发布时间:10/21/2006 10:59:00 AM

--  
lanmaozi说的对,编译环境不同,结果也是不同的。我在VC++6.0和VS2005下的结果都是15,但在Dev-C++ version4.9.9.2下,所得的结果是13。

如下所示:

#include <stdio.h>

int main(void)
{
    int i=2;    
    
    printf("%d\n",(++i));
    i=2;
    printf("%d\n",(++i)+(++i));
    i=2;
    printf("%d\n",(++i)+(++i)+(++i));
    i=2;
    printf("%d\n",(++i)+(++i)+(++i)+(++i));
    i=2;
    printf("%d\n",(++i)+(++i)+(++i)+(++i)+(++i));
    
}

所得结果如下:

3
8
13  (即(++i)+(++i)+(++i)的结果)
19
26


--  作者:fresh_kid
--  发布时间:10/24/2006 11:44:00 PM

--  
这是个表达式求值问题,与运算附的优先级有关:++比+的优先级高,而且好像是从右至左,所以在
int i=2
printf("%d",(++i)+(++i));
中应该先是++i 后i为3,对于(++i)+i仍旧是先执行++i,之后i为4,剩下i+i
结果就为4+4=8
我在vc++6.0中实验过:
#include<stdio.h>
void main(){
    int i=2,j=2,k=2;
    printf("k=%d\n",(++k));
    printf("j=%d\n",(++j)+(++j));
    printf("i=%d\n",(++i)+(++i)+(++i));
                }
   输出:
          k=3
          j=8
          i=13
     j如前面所说为8,我觉得i应该为15,不知为何会是13。
--  作者:wcdxyl
--  发布时间:10/27/2006 2:40:00 PM

--  
啊?不好意思我用的是java得到12的。真的是编译器的问题???但从逻辑上是12没有错啊
--  作者:wcdxyl
--  发布时间:10/27/2006 3:10:00 PM

--  
终于搞清楚了。在Java语言的程序运行过程中.变量在每一次被引用时,都会创建相应的对象实例,分配相应的内存区域,其中的内容不会被重写,所以是12。c中是重写了,应该是15
--  作者:wcdxyl
--  发布时间:10/27/2006 3:25:00 PM

--  
总结下:看来开发程序的时候要注意不要这么写,有歧义的,最好分开写。
想要12就 a= i++;  b = i++; c=i++;   ->a+b+c
想要15就 a = i++; a = a++; a=a++; -> a*3

这样逻辑清楚也不会错,多好啊。如果哪个编译器这都能搞错就是它的问题了,呵呵


--  作者:quanquanjw
--  发布时间:12/14/2006 1:17:00 PM

--  
我都快忘记了

--  作者:lidongbin
--  发布时间:12/15/2006 9:52:00 PM

--  
因为有些编译器的理解很特别
支持动态赋值的编译器就理解为不同的值了
--  作者:一分之千
--  发布时间:1/5/2007 6:12:00 PM

--  
这个就是编译器的不同出来的不同结果
在写程序的时候还是不要写这么垃圾的语句吧?
不过有得BT公司会拿来面试用.....呵呵

--  作者:追梦
--  发布时间:2/7/2007 5:43:00 PM

--  
我用c#编译了也是12
--  作者:zhang_tao
--  发布时间:5/9/2007 1:57:00 PM

--  
在VC下执行下面的程序应该知道为什么了
int main()
{
 int i=2;
 printf("%d\n",(++i)+(++i)+(++i));
 i=2;
 printf("%d\n",i+(++i)+(++i));
 i=2;
 printf("%d\n",(++i)+(++i)+i);
 
        getchar();
 return 0;
}



--  作者:weson
--  发布时间:5/9/2007 10:14:00 PM

--  
我觉得逻辑上是12``JAVA和C#下得出的是12啊``  
编译方式不同吧```
这是老谭爷爷的题目吧````
他老人家最爱出这样的题目了``有的题目`每次运行的结果都不一样``
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
125.000ms