下面两段代码的输出结果有什么不同:
代码一:
#include <iostream>
using namespace std;
int main()
{
int a, x;
for (a = 0, x = 0; a <= 1 && !x++; a++)
{
a++;
}
cout << a << x << endl;
return 0;
}
代码二:
#include <iostream>
using namespace std;
int main()
{
int a, x;
for (a = 0, x = 0; a <= 1 && !x++;)
{
a++;
}
cout << a << x << endl;
return 0;
}
分析:
对于第一段代码:
- 首先执行a和x的初始化,都初始化为0
- 进行判断,a<=1为true,!x为1为true,true&&true为true,继续执行下面的操作
此处应该注意 a<=1 && !x++的执行顺序,首先执行a<=1的判断,然后执行!x的判断,然后判断a<=1 && !x的判断,最后进行x的自增
3.对x进行自增,此时x=1
4.执行for循环内部的a自增,自增后a=1
5.执行for循环判断中的a自增,自增后a=2
6.进入下一个循环,此时,a<=1为false,后面的都将不执行
因此代码一执行完成后,a=2,x=1,输出为21
对于第二段代码:
- 首先执行a和x的初始化,都初始化为0
- 进行判断,a<=1为true,!x为1为true
此处应该注意 a<=1 && !x++的执行顺序,首先执行a<=1的判断,然后执行!x的判断,然后判断a<=1 && !x的判断,最后进行x的自增
3.对x进行自增,此时x=1
4.执行for循环内部的a自增,自增后a=1
5.进入下一个循环,此时,a<=1为true,!x为0为false,对x进行自增,此时x=2,然后true&&false为false,终止循环
因此代码二执行完成后,a=1,x=2,输出为12
此处代码中还有一个需要注意的地方,对于代码二的for循环for (a = 0, x = 0; a <= 1 && !x++;)
,即使没有执行完一次循环后的操作,分号也是必须要保留的。