用弧光的灯照射锌板:关于C++的问题,高手来答哦!

来源:百度文库 编辑:中科新闻网 时间:2024/05/06 00:48:26
int i=3,j=2;
void p()
{
for(int i=2;i<5;i++)cout<<i+++j<<'\n';
}
main()
{
p();
}

请问这个程序运行的结果是什么?最好有过程,谢谢了.

这就由我来解决吧 i=3在进入循环后变为2
当i=2的时候,运行完(i++)+j=4
这时运行循环语句外面的(i++),i变成了3
所以再运行循环里(也就是循环语句的i++)时i又变成了i=4
然后运行i+++j=6
这时再运行循环语句外面的(i++),i就变成i=5超出了i<5的范围了,不符合循环条件,所以语句结束了.
最后的结果是4,6

4
6
同一楼

我觉得不一定,这样的句子,不同的编译器解释应该不同。郁闷,谁写这样的句子,除了机器没人能知道结果是什么。

我也觉得可能会根据编译器的不同有不同的结果,因为以前学c语言时,那个a+i++对于不同的编译平台,肯定会有不同的结果。一种编译器是从后面运算过去的,一种编译器是从前面运算来。所以会产生不同的结果。我想,这也许,也会有不同的结果。
但是在现实中,我们的编程思想是:不要去找一些死角的东西,再说一般谁会去这种语句。最好是不要滥用++语句,如果滥用++语句,会产生一些意外的结果。就像是程序员们常说的,不要滥用goto语句一样。

4
6
一楼的解释够清楚了
这种代码不要写是没错,但是就TMD考试喜欢考知道么,二楼你见过什么叫考试么?少来这里废话

 
 
 
1)其实这程序里有 3 个变量:全局的 i 和 j 及 p( ) 里头局部的 i
  (试试在 p( ); 之后加上 cout << i << endl; 看看)。
2)p( ) 里头的 for 循环里声明的 i 完全覆盖全局 i(见 http://topic.yesky.com/topic/149/291960.html),
   所以 for 循环里可见的只是局部 i 和全局 j 。全局 i 根本没有机会进入该循环。
3)导致 i+++j 被编译器当作 (i++)+j 的原因其实并非操作符的优先级,而是编译器的贪婪匹配原则
   (http://www.china-pub.com/computers/subject/huodong/excep/index_3.htm)。
4)所有遵循 ANSI C++ 标准的编译器都会让这程序输出相等于“4\n6\n”的数据。

作用于 i 的自增运算符是后置式的,所以 i 的值被使用之后才自增,即该循环可以被简化为:

for ( int i = 2; i < 5; i++ ) {
    cout << i + j << '\n';
    i++;
}

也就是等于这个非常容易分析的 while 循环( j 由始至终都是初值 2,没有变卦,所以可以用 2 代替):

int i = 2;
while ( i < 5 ) {
    cout << i + 2 << '\n';
    i++;
    i++;
}

这里有 for 循环的操作细节:
http://www.programfan.com/article/showarticle.asp?id=2678