紧急求助!!初学者问题

yoeiki 2004-03-30 04:30:08
二级c教材我已经看过一遍了,看的时候都可以理解,但是前天我买了一份预测卷做,才考40分!!现在才发现原来还有许多东西没掌握,我晕啊~~4月3日就考试了,
请大家帮帮我~~~~
=======================================================================
(1)
比如 int *p,a[5],b; 要使指针p指向a[5]或b,我看过有n种方法,不知哪个是正确的?
1 *p=&a[5]; 7 *p=&b;
2 *p=a[5]; 8 *p=b;
3 *p=a; 9 p=&b;
4 p=&a[5]; 10 p=b;
5 p=a[5];
6 p=a;
=======================================================================
(2)
main()
{
int c1=2,c2=0;
while(!c2--) 请问 !c2-- 怎么判断是真是假?没有表达式
{printf("%d%d",c1--,c2);}}
还有这个
while(1) while(m) 它们都没有表达式,怎么判断?
====================================================================== (3)
#include<stdio.h>
#include<string.h>
main()
{
char ss[10]="1,2,3,4,5";
get(ss); strcat(ss,"6789"); printf("%s\n",ss);
如果输入ABC的话 答案是ABC6789。我有一点不明白就是在执行get(ss)之后,ss[10]
中数据都被删除了吗?我一直觉得是ABC45。
======================================================================
(4)
题目: 设 a=5,b=6,c=7,d=8,m=2,n=2,执行(m=a>b)&&(n=c>b)后n得值为:答案 是1。 我不明白的是书

上不是写当第一项表达式为0时,整个逻辑表达式为假,然后将跳过第二项,那为什么n不等于2?
=========================================================================
(5)
操作不合法的是
int x[6],*p; p=&x[0];
int x[6],*p;*p=x;
int x[6],*p;p=x;
int x[5],p;p=x[0];
什么叫做操作不合法?里面似乎全没错????
=======================================================================
(6)
int *p,m=5,n; 正确的是
(a)p=&n; scanf("%d",&p);
(b)p=&n; scanf("%d",*p);
(c)scanf("%d"n);*p=n;
(d)p=&n; *p=m;

能不能帮我分析一下a,b,c有什么错误???
====================================
(7)
main()
{
int a[4][3],*p[4],j;
for(j=0;j<4;j++) p[j]=a[j];
为什么a[4][3]和a[1]不能表示数组元素呢?
=====================================
(8)
sub(char *a,char b) { char c;c=*a;*a=b;b=c;}请问这个涵数代表什么意思?
sub(char *a,char *b) {char c; c=*a;*a=*b;*b=c;} 这个呢?
====================================
(9)

 char *s="12134211"; intv[4]={0,0,0,0},k,i;
for(k=0;s[k];k++)
{switch(s[k])
{case'1':i=0;
case'2':i=1;
case'3':i=2;
case'4':i=3;}
v[i]++;} v[i]++???数组不是不能整体操作么?
for(k=0;k<4;k++) printf("%d",v[k]);}

能告诉我这个程序如何执行的吗?我看不懂
====================================
(10)
{
union{ int i{2]; long k; char c[4];}r, *s=&r;
s->i[0]=0x39;
i->i[1]=0x38;
printf("%c\n",s->c[0]);}
请问结果为什么是9,是怎么执行的?
=====================================
(11)
int a[3][3]={{1,2},{3,4},{5,6}},j,j,s=0;
for(i=1;i<3;i++)
for(j=0;j<=i;j++) s+=a[i][j];
printf("%d\n",s);

a得存储模式是这样吗?1 2 0
           3 4 0
           5 6 0  
答案怎么是18呢? 好像只是3和6啊?加起来也是18啊?
===================================
万分感谢!!!!!!!!!!!!!!!

...全文
41 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
langjifengyu 2004-03-31
  • 打赏
  • 举报
回复
我个人认为也是n=2的
到底是什么我也不太清楚
茫然
zhouqingyuan 2004-03-31
  • 打赏
  • 举报
回复
基本上,应该都不会处理n=c>b这个的
hswu 2004-03-31
  • 打赏
  • 举报
回复
楼上的,你的高手有误人子弟之嫌。
(m=a>b)系统是结果取左判断,所以变成了if (m),这时m=0,所以结果为false
不信你可以试:
if (m=a>b)
{
printf("true");
}
else printf("false");

这里的问题根据编绎器不一样会有所区别,主要是编绎器会否优先处理n=c>b赋值操作
yoeiki 2004-03-31
  • 打赏
  • 举报
回复
哦,终于看懂了,谢谢
langjifengyu 2004-03-30
  • 打赏
  • 举报
回复
(m=a>b)&&(n=c>b)
刚才请教了一个高手,现在好象知道答案了
不过觉得合适啊
在(m=a>b)中a>b是假的,值为0,然后将0赋值给m
而m=0这个语句是真,所以(m=a>b)这个的值是1不是0
所以后面的哪个饿(n=c>b)还是要执行的,c>b是真的
将1赋值给n结果就是1了
如果那位觉得不合适
请告诉我咋们探讨
langjifengyu 2004-03-30
  • 打赏
  • 举报
回复
那位老大发现这个错误了
告诉我一声
就是第4题啊
我觉得合适啊
littleeagle007 2004-03-30
  • 打赏
  • 举报
回复
3 ,9
Darkay_Lee 2004-03-30
  • 打赏
  • 举报
回复
看书学习的时候一定要做后面的联系,thq的C语言书写得还是比较好的,把练习都做了吧,肯定理解深刻很多
langjifengyu 2004-03-30
  • 打赏
  • 举报
回复
以前老在WINDOWS专区里混
没想到到c里面没~~了
我悲哀啊
langjifengyu 2004-03-30
  • 打赏
  • 举报
回复
我也是4月3号和你共扑沙场的战友啊


1:第6个第7个合适
数组的指针指向数组元素的第一个地址,a[5]的第一个元素是a[0],
地址是&a[0],而用指针时指向的地址是a,以后的依次加:a+i,不过i<n
指针指的是地址&b是b的地址,不用说肯定正确
2:while函数的判断条件只要不是0就是真
例如;while(!k)
只要!k的值不为零一直循环,你所说的
m=100
while(m)
m--
这个程序只有当m--到m=0时停止
光几着while()里面的值为0是终止循环
3:大哥strcat是字符串连接函数,他是把字符串连接起来
你说的哪个函数是strcpy
4:这道题我觉得也是2,可能答案错了
5:int x[6],*p;*p=x;这个错了,x是x{6}的首地址
应该是p=x就合适,*p是制向p地址中的内容的,而x是地址
不能赋值的
6:int *p,m=5,n; 正确的是
( a)p=&n; scanf("%d",&p);
这个*p是个指针,p就是个地址,给他前面加个&那成什么了啊
(b)p=&n; scanf("%d",*p);
*P是个指针,他指向的是一个数值,而SCANF函数后面的是地址
既然是地址,那就要用P或*了
(c)scanf("%d"n);*p=n;
这个里面N前面好想少了个逗号吧,而切给N没有赋值,N没数据
那么赋值给*P的是什么东西了,计算机会随机产生的
(d)p=&n; *p=m;

7:数组的第一个元素是从0开始的,a[4][3]中最高的是a[3][2],
即最高的是定义的最大书减1,因为从0开始,不是从1开始
8:sub(char *a,char b) { char c;c=*a;*a=b;b=c;}
sub(char *a,char *b) {char c; c=*a;*a=*b;*b=c;}
这2个都是数值交换语句,第一个用*a指针指向了一个数
而第2个用了2个指向数值的指针
9:{
 char *s="12134211"; intv[4]={0,0,0,0},k,i;
for(k=0;s[k];k++)
{switch(s[k])
{case'1':i=0;
case'2':i=1;
case'3':i=2;
case'4':i=3;}
v[i]++;} v[i]++???数组不是不能整体操作么?
for(k=0;k<4;k++) printf("%d",v[k]);}

v[i]++???数组不是不能整体操作么?
你这句话什么意思看不懂啊
10:这个函数是共用体函数,公用体处理数据是从最后一个开始执行的

union{ int i{2]; long k; char c[4];}r, *s=&r;
s->i[0]=0x39;
i->i[1]=0x38;
printf("%c\n",s->c[0]);}
因为共用体公用一个内存单元,所以只能存贮最后一个输入的数据
因此这个打应的是是十六进制的38,把他换算成十进制的,然后按字符型
格式打印就是ASCLL吗中的字符9了

11:int a[3][3]={{1,2},{3,4},{5,6}},j,j,s=0;
for(i=1;i<3;i++)
for(j=0;j<=i;j++) s+=a[i][j];
printf("%d\n",s);

a得存储模式是这样吗?1 2 0
           3 4 0
           5 6 0  
第一个循环i=1所以他是从第2行开始循环的
而此时的j<=i,所以执行j=0 j=1这2个循环,即3和4
当i=2时,而此时的j<=i,执行j=0 j=1 j=2这三个循环,即5 6 0
加起来不是18吗

终于完了
不知道解决了你的问题没有
如果解决了,我可有2大高兴事啊
一个是帮你解决了问题
另一个是?
我不说你也知道吧
呵呵
我今年也考C语言的2级了
现在好好把书看一下
考试不要紧张肯定过的
我预祝你肯定过得了2级的
希望能和你做个朋友
以后咋们共同探讨C语言
           



hswu 2004-03-30
  • 打赏
  • 举报
回复
1->4,9
2->判断c2是否不为零即可,while(1)==while(true), while(m) m为可转换为Boolean的变量
3->strcat会在"6789"后面加结束符0x00
4->根据编绎器不同可能得到1或2,书上不一定都是正确的。
5->2
6->(a)错在scanf...&p指向的是指针的地址
(b)错*p不是指针
(c)错在没有","且n不是地址
(d)正确
7->a[4][3]越界,a[1]是一个指针而不是一个元素,a[0][1]才是元素
8->1.把字串a的第一个字符换成b字符
2.把字串a,b的第一个字符互换
9->0,0,0,8注意case中没有break,所以每次i都等于3
10->开会,没空了,haha
huanmm 2004-03-30
  • 打赏
  • 举报
回复
操作不合法的是
int x[6],*p; p=&x[0];
int x[6],*p;*p=x;
int x[6],*p;p=x;
int x[5],p;p=x[0];
什么叫做操作不合法?里面似乎全没错????

操作不合法的定义我不太清楚
不过我的理解是编译不过就是操作不合法
那么按照这个理解
int x[6],*p;p=&x[0]; //合法
int x[6],*p;*p=x; //不合法,因为类型不对,*p应该是int,而x指向int的指针
int x[6],*p;p=x; //合法
int x[5],p;p=x[0]; //合法

以上是从语法的角度来讲的
从语句的实际含义来讲(如果不考虑语法的话)你可以参照我对第一题的解释
huanmm 2004-03-30
  • 打赏
  • 举报
回复
(4)
题目: 设 a=5,b=6,c=7,d=8,m=2,n=2,执行(m=a>b)&&(n=c>b)后n得值为:答案 是1。 我不明白的是书上不是写当第一项表达式为0时,整个逻辑表达式为假,然后将跳过第二项,那为什么n不等于2?

这个问题我也不清楚
跟你一起学习啦
希望高人指点
zouxueping 2004-03-30
  • 打赏
  • 举报
回复
int *p,m=5,n; 正确的是
(a)p=&n; scanf("%d",&p); //p本身就是地址,这里取p的地址,就把输入的整数赋给指针p了
(b)p=&n; scanf("%d",*p);//*p即n,输入时需用地址,不能直接用变量
(c)scanf("%d"n);*p=n;//输入错误同上,使用p的错误同第(5)题。
(d)p=&n; *p=m;
icenl 2004-03-30
  • 打赏
  • 举报
回复
只是为了考试的话, 你不用这么麻烦, 直接找你们老师就得了
huanmm 2004-03-30
  • 打赏
  • 举报
回复
(3)
#include<stdio.h>
#include<string.h>
main()
{
char ss[10]="1,2,3,4,5";
get(ss); strcat(ss,"6789"); printf("%s\n",ss);
如果输入ABC的话 答案是ABC6789。我有一点不明白就是在执行get(ss)之后,ss[10]
中数据都被删除了吗?我一直觉得是ABC45。

你猜对了
准确地说不是被删除,而是被覆盖
调用get(ss)输入的时候是从ss的首地址开始
输入ABC后系统再自动补上'\0'作为输入字符串的结束
这个时候就算第五个字符'5'没有被覆盖
由于前面有了'\0'代表字符串已经结束
strcat的时候也将忽略'\0'后面的所有字符
pringf的时候也是一个道理
windcloudhhb 2004-03-30
  • 打赏
  • 举报
回复
(1)
2,3,5,6,7,9对。
(2)
根据我调试的结果为:(!c2--)先执行
!c2操作,while语句判断为真以后,进入while语句里边后,C2再执行减-1操作。
zouxueping 2004-03-30
  • 打赏
  • 举报
回复
int x[6],*p; p=&x[0];
int x[6],*p;*p=x;
int x[6],*p;p=x;
int x[5],p;p=x[0];
这里操作不合法指非法操作内存。

int x[6],*p;*p=x;这里p没有初始化,指向任意位置,*p=x非法改变了未知区域的数据。

int x[5],p;p=x[0];这里将p初始化为x[0],而x[0]本身还没有赋值,使用没有初始化或赋值的数据在编译时会给出警告。
huanmm 2004-03-30
  • 打赏
  • 举报
回复
(2)
main()
{
int c1=2,c2=0;
while(!c2--) 请问 !c2-- 怎么判断是真是假?没有表达式
{printf("%d%d",c1--,c2);}}
还有这个
while(1) while(m) 它们都没有表达式,怎么判断?

"!c2--"就是一个表达式,这个问题如果你都没搞明白,可以说你根本连c语言的皮毛都没有摸到
while() if() for()判断的并不是表达式,而是表达式的最终结果
而表达式的最终结果就是得出"0"或"非0"
1就是非0
m根据程序里的值决定是0还是非0

从另一个角度来说
1也是一个表达式
m也是一个表达式

不过你不用太灰心,只要认真地去看书并且多练习,这些问题都会明白的
zouxueping 2004-03-30
  • 打赏
  • 举报
回复
(4)的答案应该是n=2
加载更多回复(6)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧