c语言在线答疑,求高人指导~~~谢谢了~~~

2 以下程序的输出结果是 -27 。
#include<stdio.h>
void main()
{ char c;
c=0345;
printf("%d\n",c);
}
为什么是得-27求具体过程~~~

6 若输入字符串:abcdefg<回车>,则以下while循环体将执行 0 次。
while((ch=getchar())=='g') printf("*");
为什么是0次啊,不明白~~~

15 运行下面程序,其输出结果是 321 。
#include <stdio.h>
main()
{ void printd()
int n=123;
printd(n);
}
void printd(int n)
{ int i;
if(n<0) { n=-n; putchar('-'); }
putchar(n%10+'0');
if((i=n/10)!=0) printd(i);
不太明白~~~
16 以下程序的输出结果是 abb 。
#include<stdio.h>
void main()
{ char ch[]="abc",x[3][3]; int i;
for(i=0;i<3;i++) strcpy(x[i],ch);
for(i=0;i<3;i++) printf("%s",&x[i][i]);
printf("\n");
}
17 运行下面程序,从键盘输入三个字符ab#,其输出是 ab##ba 。
#include <stdio.h>
void recursion()
{ char c;
c=getchar();
putchar(c);
if(c!='#') recursion();
putchar(c);
}
void main()
{ void recursion();
recursion();
}

18 以下程序的输出结果是__55__。
#define M 5
#define N M+M
main()
{ int k;
k=N*N*5; printf("%d\n",k);
}

19 以下程序的输出结果是 12 15 。
#include <stdio.h>
void swap(int *a, int *b)
{ int *t ;
t=a; a=b; b=t;
}
void main()
{ int i=12, j=15, *p=&i, *q=&j;
swap(p,q);
printf("%d %d\n", *p,*q);
}
谢谢高手们了~~~~

第一个:你定义的是char,其表示范围是-128到127;你的0345是八进制数,换算成十进制是229,原码是11100101,反码是10011010,补码是10011011,其表示的就是-27的二进制数在计算机里面的存储。

第二个:((ch=getchar())=='g') ,这个条件判断中的ch=getchar()这个表达式的值在你输入a的时候,不等于'g',循环终止。所以是0次。

第三个:putchar(n%10+'0');n=321,n%10+'0'=’1‘;if((i=n/10)!=0) printd(i)中,i=n/10 的值是32,后面递归调用函数本身。3次函数调用输出的字符分别是'3','2','1'。

第四个:抱歉,你给的答案是错误的。输出结果应该是abcabcabcbcabcc;原因如下:二维数组里面存的是abc,abc,abc这9个字符。循环3次输出分别从第一个,第五个,第九个字符输出。

第五个:这个是函数的递归调用。第一次输入a,并递归到下一层输入b,再递归到下一层输入#
条件符合退出递归,输出当前层的c,即#,退回上一层输出当前c,即b,再退回上一层输出当前c,即a。这就是ab##ba。

第六个:这个是由于define中的M+M没有加()。表达式经编译器编译后就是M+M*M+M*5,就是55。如果在define中加上括号,即(M+M),表达式就是(M+M)*(M+M)*5了。

第七个:你在swap中交换的是指针的值,不是指针指向的空间的值。所以没有交换成功。就是原来的12和15。

完了。。我真是闲的呵呵。。。。大半夜睡不着觉。。。。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-06-17
唉 没给红分就想解这么多怪怪题 谁叫我人好呢 没办法
1.c是用八进制表示的,那么十进制的话就是229,c的ASCII等于229,可是ASCII只表示到到128啊,所以应该模128,但是我不知道模的时候为什么不取正数101,而取了-27,也许是补码问题.
2.getchar()只接受一个字符,你都把条件定义为遇到‘g’才执行,很显然,第一次循环都因条件不满足直接跳过了,后面的哪还有机会啊。
3.putchar(n%10+'0');这里先求出个位数并输出,if((i=n/10)!=0) printd(i);这里求出除了个位之前的所有数,然后以这些数位参数继续递归 输出最后一位,直到为0,也就是之前的数全部输出。
4.这个跟地址有很大关系了,输出结果不是abb吧应该为:abcabcabcbcabcc
for(i=0;i<3;i++) strcpy(x[i],ch);这个语句把数组x赋值为abcabcabc, printf("%s",&x[i][i]);第一次循环时从数组第【0】【0】个地址处开始输出:abcabcabc,第二次循环时从数组第【1】【1】个地址处开始输出:bcabc,第三次从数组第【2】【2】个地址处开始输出:c 所以最后输出应该为:abcabcabcbcabcc
5.这是个递归调用问题,当你输入的不是‘#’就递归,一层一层地递归,但是别忘了后面还有个putchar(c)一直保存着你当前的输入,当你条件不满足时退出递归,程序又会一层层输出原来保存的值 所以自然会对称输出。
6.这是因为你在M+M这没打上括号,所以最后执行为:M+M*M+M*5 先乘除后加减,所以就会输出55了
7.你虽然传了地址,交换了地址,但是并没有交换值啊,就像两个人手中分别拿着两个盒子,盒子里面装有不同的东西,你现在把他们的盒子交换了,但是里面的东西还是一样的啊,所以你应该这样写:
void swap(int *a, int *b)
{ int t ;
t=*a; *a=*b; *b=t;
}
这样才是交换了合子里面的东西追问

谢谢嘎

第2个回答  2012-06-17
为什么是-27呢?
因为0345转化成二进制是111001101,负数在计算机存储是高位不变,反码+1,你把111001101减一取反,保持高位不变就是-27了。
第6题 每次getchar只是读取一个字符,无论你输入多少个字符按回车,这个函数只是读取一个,所以ch=‘a’怎么可能会有循环呢?
15题
printd是个递归函数,每次if(i !=0)就调用下,这样每次打印出3 2 1 。这个函数谁写的,还是错误的,函数都没申明。而且参数都错了,一塌糊涂写的,
晚上只是帮你解决这么多,有事情明天再说,我睡觉了,晚安本回答被网友采纳
相似回答