搜索
查看: 2494|回复: 6
打印 上一主题 下一主题

网上视频教程里的例子,我这样改写和分析代码的对吗?

[复制链接]
跳转到指定楼层
楼主
发表于 2012-7-21 18:59:40 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
视频里的例程是这样写程序源代码的:
#include <stdio.h>
void main()
{   char *s1,*s2 ,
          str1[30]="BeiJing",str2[10]="China";
     for(s1=str1;*s1!='\0';s1++);
     for(s2=str2;*s2!='\0';)
        *s1++=*s2++;
    *s1='\0';
    printf("%s\n",str1);}

=======================
我把例程的源代码改写和分析如下,如果分析错了,请高手指教!我将不胜感激!先说声谢谢啦!

/*指针发应用例程:将字符串str2复制连接到str后*/------->此注释是我自己添加的,为的是以后读程序能够知道程序的功能。
#include <stdio.h>
int main()
{                                                                   ------->(疑问1)花括号书写规范是不是应该单独占一行?
    char str1[30]="BeiJing",str2[10]="China";------->(疑问2)按照自学考试教程的要求,定义指针前应该先定义要指向的
    char *s1,*s2;                                                         数据,所以我把字符串数组定义在先,指针定义在后,这样理解对吗?
    for(s1=str1;*s1!='\0';s1++);------->(疑问3)这个for循环执行语句是个空语句,所以后直接以分号“;”结束,这样理解对
    for(s2=str2;*s2!='\0';)                                     吗?
        *(s1++)=*(s2++);-------->(疑问4)我觉得这样加上“()”书写比较清楚,表达的意义唯一,程序易读没有二意性,这样
    *s1='\0';                                   理解对吗?虽然程序运行正确,但是我觉得加上括号好像改变了上面例程里代码的意思!?
    printf("%s\n",str1);
   sleep(5000);
   return 0;
}

最佳答案

查看完整内容

首先,疑问1,花括号单独占一行只是为了美观,对程序运行结果没有影响; 疑问2,定义指针前不需要先定义要指向的数据,只需要在指针指向数据前,将数据定义就好了。 疑问3,这个FOR循环是个空循环,为的是将指针指向字符串str1的最后一位的结束字符'\0'。 疑问4,反正我编译后,加不加括号对运行结果没有影响,具体有没有改变例程的代码的意思就不知道了。
沙发
发表于 2012-7-21 18:59:41 | 只看该作者
首先,疑问1,花括号单独占一行只是为了美观,对程序运行结果没有影响;
疑问2,定义指针前不需要先定义要指向的数据,只需要在指针指向数据前,将数据定义就好了。
疑问3,这个FOR循环是个空循环,为的是将指针指向字符串str1的最后一位的结束字符'\0'。
疑问4,反正我编译后,加不加括号对运行结果没有影响,具体有没有改变例程的代码的意思就不知道了。
板凳
 楼主| 发表于 2012-7-21 19:04:05 | 只看该作者
上面写乱了。所以重新排版在发布一下:
=================================

视频里的例程是这样写程序源代码的:

#include <stdio.h>
void main()
{   char *s1,*s2 ,
          str1[30]="BeiJing",str2[10]="China";
     for(s1=str1;*s1!='\0';s1++);
     for(s2=str2;*s2!='\0';)
        *s1++=*s2++;
    *s1='\0';
    printf("%s\n",str1);}

===================================
我把例程的源代码改写和分析如下,如果分析错了,请高手指教!我将不胜感激!先说声谢谢啦!

/*指针发应用例程:将字符串str2复制连接到str后*/------->此注释是我自己添加的,为的是以后读程序能够知道程序的功能。
#include <stdio.h>
int main()
{  ------->(疑问1)花括号书写规范是不是应该单独占一行?
    char str1[30]="BeiJing",str2[10]="China";------->(疑问2)按照自学考试教程的要求,定义指针前应该先定义要指向的 数据,所以我把字符串数组定义在先,指针定义在后,这样理解对吗?
    char *s1,*s2;                                                        
    for(s1=str1;*s1!='\0';s1++);------->(疑问3)这个for循环执行语句是个空语句,所以后直接以分号“;”结束,这样理解对  吗?
    for(s2=str2;*s2!='\0';)                                   
        *(s1++)=*(s2++);-------->(疑问4)我觉得这样加上“()”书写比较清楚,表达的意义唯一,程序易读没有二意性,这样 理解对吗?虽然程序运行正确,但是我觉得加上括号好像改变了上面例程里代码的意思!?
    *s1='\0';                                 
    printf("%s\n",str1);
   sleep(5000);
   return 0;
}
地板
发表于 2012-7-23 10:23:52 | 只看该作者
楼主学了多长时间了,看疑问一应该不会学很长时间,但是怎么刚开始就学指针了~~~  能看懂吗?  基础要打好  慢慢来~~~
------->(疑问1)花括号书写规范是不是应该单独占一行?
程序分行是为了美观 大方 易读。举个例子:
#include <stdio.h>
int main()
{      
printf("cross fire");
sleep(1000);
return 0;
}

#include <stdio.h>
int main(){      printf("cross fire");sleep(1000);return 0;}
运行结果无异。
没学指针。

5#
 楼主| 发表于 2012-7-23 11:21:35 | 只看该作者
3guoyou3333 发表于 2012-7-23 10:23
楼主学了多长时间了,看疑问一应该不会学很长时间,但是怎么刚开始就学指针了~~~  能看懂吗?  基础要打好  ...

我自学C语言快了一个月了。
6#
发表于 2012-8-24 19:34:42 | 只看该作者
好厉害  我根本看不懂
7#
发表于 2012-8-27 21:53:20 | 只看该作者
[ 本帖最后由 virfyf 于 2012-8-27 21:55 编辑 ]\n\n
*(s1++);与*s1++;是一样的
因为*取值运算符与++自增1运算符优先级相同,并且 结合方向是从右到左,
所以,即使是*s1++也是先s1本身++,再*取值.

验证程序
[mw_shl_code=c,true]#include <stdio.h>
int main()
{
        int *a,*b;
        a=(int*)malloc(2*sizeof(int));
        b=a;
        a[0]=1;
        a[1]=2;
        *a++;
        printf("*a++ : %d %d\n",a,*a);
        
        a=b;
        a[0]=1;
        a[1]=2;
        *(a++);
        printf("*(a++) : %d %d\n",a,*a);
        
        a=b;
        a[0]=1;
        a[1]=2;
        (*a)++;
        printf("(*a)++ : %d %d\n",a,*a);
        
        free(a);
        getch();
        return 0;
}[/mw_shl_code]

另外附上C语言运算符优先级表


C语言运算符优先级 详细列表 Slyar Home.png (123.73 KB, 下载次数: 35)

C语言运算符优先级 详细列表   Slyar Home.png
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表