程序输出结果

2024-11-28 15:57:06
推荐回答(5个)
回答1:

这个是一个关于指针的问题,你本身程序有误,int k;而不是ki。printf("%d,%d",m[k-1],n[k-1]);
这句话打印1,22,43,6。其实应该是1 2, 2 4, 3 6,三对数,你输出形式不对可以改成
printf("%d %d,",m[k-1],n[k-1]),以上是输出上的纠正。下面是对程序的理解:
for (k=1;k<4;k++,px++,py++)
{
*px = k; *py = 2*k;
printf("%d,%d",m[k-1],n[k-1]);
}
这句话的意思是初始化m[],n[]。*px,*py表示m[i],n[i]的值,得到m[0]=1,n[0]=2;m[1]=2,n[1]=4;m[2]=3,n[2]=6。

px = &m[1];// px指向m[1]对应的地址。
py = &n[1]; //py指向n[1]对应的地址。
for (k=1;k<3;k++)
{
*px += k; *py *= k;
printf("%d,%d,",*px++,*py++);
}
printf("\n");
}
这里要特别注意*px++和*py++ ,*px++不等同于*px=*px+1;*px++等同于px++,即px指向下一个地址。而*px=*px+1则是对*px的值增加1,地址没变。
所以也可以进行这样改动:
for (k=1;k<3;k++,px++,py++)
{
*px += k; *py *= k;
printf("%d,%d,",*px,*py);
} //结果是一样的。
希望能对你有用。

回答2:

补充:

注意看这三行的过程:
(1)外部循环体:执行i++,i=7
(2)外部循环体:结束前执行for内的i++,i=8
(3)满足i<=5吗?不满足,执行cout。

实际上执行到(2)的时候,就标志着一次for循环的结束,这时候程序并不知道要不要继续执行for循环,那么它需要再回到for的头部,去判断一下for的条件是不是成立。很显然,这时候iM=5不成立,于是就不继续执行for循环,跳出来,执行cout了。

而这里执行i++,是因为for循环展开代码的特性,你可能没仔细看我写的展开代码,仔细看你会发现,for循环的第三个子句(这里就是i++)是在每次循环的结束时被执行的,无论for的条件满足不满足,只要你结束了某次循环,就会执行这个语句。
那么我们看上面三行,(1)结束后,标志着1次循环的结束,这时候不是执行下一次循环,而是直接执行i++,然后再“尝试”执行下一次for循环。(能理解我这里为什么写“尝试”么?)

我们还可以换个思路来看。
假如从一开始,(1)类似的语句结束后,不执行(2)类似的语句,直接跳到下一次for循环,也就是进入for的条件判断,那么结果会怎样?
很显然,for循环的第三个子句(i++)将永远不被执行,循环将变成死循环。

下面是补充前的回答:

-----------------------------------------

结果:

3,8

代码注释:

#include
using namespace std;
void main()
{
int i(1),a(0); // 初始化:i=1,a=0
for(;i<=5;i++) // 当i<=5满足就执行循环,每次循环结束前执行i++,一共执行5次
{
do {
i++;
a++;
} while(i<3); // 当i<3时才执行do后面的语句,一共执行3次
i++;
}
cout<}

执行过程:

// 我们称for循环为外部循环体
// 称do-while循环为内部循环体
//

初始化:i=1,a=0
满足i<=5吗?满足,进入外部循环体:
内部循环体:i=2,a=1
满足i<3吗?满足,继续执行内部循环体。
内部循环体:i=3,a=2
满足i<3吗?不满足,跳出内部循环体。
外部循环体:执行i++,i=4
外部循环体:结束前执行for内的i++,i=5
满足i<=5吗?满足,进入外部循环体:
内部循环体:i=6,a=3
满足i<3吗?不满足,跳出内部循环体。
外部循环体:执行i++,i=7
外部循环体:结束前执行for内的i++,i=8
满足i<=5吗?不满足,执行cout。

回答3:

int m[5],n[5],*px,*py,ki;
这里估计你粗心了 ki应该是k
这样才能运行程序
结果是
1,22,43,6
3,4,5,12 ,

回答4:

代码本身存在问题:
k没有定义就直接使用了,正常是不能通过编译的
在使用之前添加了int k=0;之后可以通过编译

运行结果:
1,22,43,6
3,4,5,12,

回答5:

1,22,43,6
3,4,5,12