题目一:比较下面两段代码的不同?
代码1:
#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;
}
代码2:
#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;
}
代码运行的结果是什么:代码一结果为21 ,代码二结果为12
为什么呢?大家可以清楚看到在程序中只有for循环这个地方有差别,少了一个a++,对于第一段代码来说,运行过程如下:
第一步,初始化定义a=0,x=0;
第二步,a<=1,x的非为1,符合循环条件
第三步,x++后x自增为1
第四步,进入循环体后,执行a++,a自增为1
第五步,执行for循环中的a++,此时a自增为2
第六步,a现在已经是2,不符合循环条件了,所以“&&”后面的“!x++”不执行,
第七步,打印a和b的值,分别为2和1
结果如下
第二段代码运行:
第一步,初始化定义a=0,x=0;
第二步,a<=1,x的非为1,符合循环条件
第三步,x++后x自增为1
第四步,进入循环体后,执行a++,a自增为1
第五步,a现在已经是1,符合循环条件了,所以“&&”后面的“!x++”被执行,x现在是1,x的非为0,不符合循环条件,不执行循环体,但x++依然执行,自增为2
第六步,打印a和b的值,分别为1和2
结果如下:
题目二,以下代码输出的结果是什么?
#include<stdio.h>
int main()
{
int b = 3;
int arr[] = {6,7,8,9,10};
sint *ptr = arr;
*(ptr++) += 123;
printf("%d,%d\n",*ptr,*(++ptr));
return 0;
}
我们知道C语言中printf计算参数时是从右到左压栈的。程序中
*(ptr++) += 123;的执行过程应该为*ptr=*ptr+123;ptr++,此时ptr应该指向了数组的第二个元素7。
但是,printf("%d,%d\n",*ptr,*(++ptr));中,是从右到左进行运算的,第一个(++ptr)也就是ptr++,于是*ptr=8,此时ptr指向了数组的第三个元素,所以两个值都为8.