一道C语言程序阅读题,问题如下

一道C语言程序阅读题,问题如下,第1张

首先,定义一个能容纳20个元素的字符数组

char a[20] = "xyz",

它的前4个元素通过字符串"xyz"被指定为:

a[0] = 'x', a[1] = 'y', a[2] = 'z', a[3] = '\0',后面的元素应该也都是自动初始化为'\0'。

紧接着声明两个指针变量:

p = a, p1;

p指向数组a的第一个元素的地址a[0],没有为p1指定要指向的地址,系统随机分配一个地址。

第一个for循环:从a[0]开始,让p依次指向数组a中的每个元素的地址,当p指向的地址中的字符是'\0'时,即p指向数组a中第4个元素a[3]的地址时,条件表达式值为0,结束循环。

所以第一个for循环结束时,p = &a[3]。

第二个for循环:

通过p1 = p,令p1指向 p所指向的地址的之前一个地址:&a[3]之前的一个地址,也就是a[2]的地址&a[2],a[2]的值为'z'。

即p = &a[3],p1 = &a[2]。

第1次迭代:

执行循环体:p = p1;把现在p1指向的地址&a[2]中的值'z'赋给p现在p指向的地址&a[3]。

此时p == p1 == 'z',数组a中的元素情况:

{'x', 'y', 'z', 'z', '\0', '\0', '\0', }

然后执行末尾循环体:p1--, p++;

令p1指向它之前一个元素的地址&a[1],令p指向它之后一个元素的地址&a[4]。

即p == &a[4],p1 == &a[1]

第2次迭代:

p == p1 == 'y'

{'x', 'y', 'z', 'z', 'y', '\0', '\0', }

p == &a[5],p1 == &a[0]

第3次迭代:

p == p1 =='x'

{'x', 'y', 'z', 'z', 'y', 'x', '\0', }

p == &a[6], p1 == &a[-1]

第4次迭代:

因为p1 == &a[-1],a == &a[0],所以 p1 >= a不成立。

第二个for循环结束,此时p == &a[6]。

数组元素情况不变。

接着:通过 p = 0,把p指向的地址中的内容,也就是a[6]设为空字符'\0',作为字符串结束标志,

打印字符串“xyzzyx”

考察的是:

全局变量和局部变量的作用域问题;注意main函数中的i是局部变量,fun函数中的i是全局变量;

static存储类型变量的生存期问题;注意fun函数中的m为staic修饰,只初始化依次,生存期直至退出程序

函数递归调用问题;

全局变量定义未初始化,默认值为0;全局变量i初值为0

第一次调用fun函数fun(i,&j),i为局部变量,值为1,j值为2 全局变量i=0+2+1=3,m=3,main中的j值自增为3,输出3,3,fun函数返回3

第二次调用fun函数,fun(3,&j),j值为3,全局变量i=3+3+3=9,m=4,main中的j值自增为4,输出9,4

两次输出合在一起就成了3,39,4

先说一点需要的知识

scanf:

① 遇空格、“回车”、“跳格”键,结束当前输入

② 遇宽度结束,结束当前输入

③ 遇非法输入,结束所有输入

scanf的返回值表示输入成功的数的个数,若遇到输入意外返回EOF

你的这个程序,输入逗号是遇到非法字符,scanf结束所有输入同时返回1(因为第一个值是正确的)

也就是说

如果

int ret=scanf("%d%d%d",&x,&y,&z);

printf("%d",ret);

如果输入的是

25,13,10<CR>

则程序会打印1,x的值是输入的第一个数25,但y z却是申请空间时的随机数,所以最后的printf("x+y+z=%d",x+y+z);输出是不确定的

for(i=0;i<2;i++)

for(j=0;j<2;j++)

n[i+1][j+1]+=n[i][j];

当运行玩这个循环后,i和j都是2

所以printf("%d\n",n[i][j]);会输出n[2][2]的值

具体多少,自己算,或者做个小程序算一下

1   8  10  16

#include<stdioh>

void main()

{

   int i=010,//0开头表示8进制 

   j=10,k=0x10;//0x表示16进制 

   printf("%d %d %d\n",i,j,k);

}

2  输入两个整数,输出两数之差

#include <stdioh>

void main()

{   

     int x,a,b,c;    

     printf("输入一个100-999之间的正整数:");                     

  scanf("%d",&x);    

  printf("\n");    

  a=x/100;    

  b=(x-a100)/10;    

  c=x%10                     ;       

  printf("%d的个位数是%d,十位数是%d,百位数是%d\n",x,c,b,a);

}

您好,很高兴回答您的问题。

您的这个程序主要是学会指针与数组的关系,以及数字字符型数据之间的关系。首先是定义字符型数组s,包含6个字符。然后定义指针变量p,指向字符型数据,并且p指向数组a。接下来往p所指向的位置,就是a数组中输入字符数据。当p指向的位置数据不为\0,即字符结束的标志时,对n的数据乘以8,再加上当前p所指向的字符减去字符0。需要注意的时,两个数字型字符相减,得到的就是两个数字相减的结果。

所以这个题目的结果为第一次n=08+3-0=3,第二次=38+2-0=26,第三次=268+1-0=209。所以最终输出结果为209。

第1个答案:1,2,3

1,2,5

第2个答案:是6 try()是C语言里面的关键字,最好不要用来当函数名

第3个答案:输出字符串(ps)的长度

第4个答案:y=876

第5个答案:9876

第6个答案:1

第7个答案:统计字符的个数

以上就是关于一道C语言程序阅读题,问题如下全部的内容,包括:一道C语言程序阅读题,问题如下、C语言指针读程题、c语言 阅读以下程序,当输入数据的形式为 25,13,10<CR> 正确的输出结果 为 (D) 。 为什么不是A等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9851795.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存