题目:
int main ()
{
? ? int i=2;
? ? printf("%d\n",(--i)+(--i));
? ? printf("%d\n",i) ;
? ? return 0;
}
答案:呃…………
实测:
F:\project\testprj>bcc32 test.c
Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland
test.c:
Turbo Incremental Link 5.64 Copyright (c) 1997-2002 Borland
F:\project\testprj>test.exe
1
0
-------------------------------
F:\project\testprj>gcc test.c
F:\project\testprj>a.exe
0
0
-------------------------------
F:\project\testprj>cl test.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
test.c
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
/out:test.exe
test.obj
F:\project\testprj>test.exe
0
0
2004年06月17日 09:24 沙发
2004年06月17日 09:25 板凳
出这种题的老师都是猪头,很可能自已都不知道实际结果是什么。
2004年06月17日 10:52 地板
答案是:
1
0
呵呵,出这方面题是比较变态的,因为不同的编译器或不同版本的编译器可能结果都会不一样。不过对于学习掌握了c语句中表达式、自增加、函数参数运算顺序后,得出“与答案一样的结果”应该问题不大。
再看下面这个:
void main()
{
int i;
i=3;
printf("%d %d %d\n", i++, i++, i++);
printf("%d %d %d\n", ++i, ++i, ++i);
}
呵呵,不知有没人又要抓狂了;-)
答案是:
3 3 3
9 8 7
不用在各种编译器下试了,结果大多会与答案不一样
2004年06月17日 16:02 4楼
amo你的这样做答是不合适的,这个问题本身出的就变态,各种编译器的表现不同你怎么说你的就是标准答案?
2004年06月17日 17:25 5楼
呵呵,原因见这:
http://amo.cndev.org/archive/2004/06/17/1059.aspx
2004年06月17日 18:00 6楼
我也觉得这样的题很无聊,但是bcc 编译器在第一个题上的错误我倒是觉得太明显了,如果仅仅是出于运算顺序的考虑,我会避免++ i或i ++这样的写法,但是一般的,倒是出于效率的考虑,我通常使用++ i这样的前置写法,理由如下:
如果运算的类型是像int,char等的基本类型,两者区别并不大甚或就没有区别。但是作为一些类型从载的操作符的话,就有区别了,如下例(vc6中std::map的iterator运算)
iterator& operator++()
{_Inc();
return (*this); }
iterator operator++(int)
{iterator _Tmp = *this;
++*this;
return (_Tmp); }
可以看到通常i ++可能会比++ i多做运算,并且会多一个临时的变量用来备份。
2005年05月31日 17:30 7楼
每次编程作业都是….
有回老师给个题目叫用C做,我真想打我老哥,老师在邮件里温柔的问我:你是自学的C#吗
我老实的答道:如果我能分辨那是C#,我就不会交上来了
2005年05月31日 17:34 8楼
老师邮件回复道:不管你考多少分,我决不会杀你了