啊哈磊_编程从这里起步

标题: 网上视频教程里的例子,我这样改写和分析代码的对吗? [打印本页]

作者: 天山雪    时间: 2012-7-21 18:59
标题: 网上视频教程里的例子,我这样改写和分析代码的对吗?
视频里的例程是这样写程序源代码的:
#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;
}


作者: z275813760    时间: 2012-7-21 18:59
首先,疑问1,花括号单独占一行只是为了美观,对程序运行结果没有影响;
疑问2,定义指针前不需要先定义要指向的数据,只需要在指针指向数据前,将数据定义就好了。
疑问3,这个FOR循环是个空循环,为的是将指针指向字符串str1的最后一位的结束字符'\0'。
疑问4,反正我编译后,加不加括号对运行结果没有影响,具体有没有改变例程的代码的意思就不知道了。

作者: 天山雪    时间: 2012-7-21 19:04
上面写乱了。所以重新排版在发布一下:
=================================

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

#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;
}
作者: 3guoyou3333    时间: 2012-7-23 10:23
楼主学了多长时间了,看疑问一应该不会学很长时间,但是怎么刚开始就学指针了~~~  能看懂吗?  基础要打好  慢慢来~~~
------->(疑问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;}
运行结果无异。
没学指针。


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

我自学C语言快了一个月了。
作者: 我要学C语言    时间: 2012-8-24 19:34
好厉害  我根本看不懂
作者: virfyf    时间: 2012-8-27 21:53
[ 本帖最后由 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





欢迎光临 啊哈磊_编程从这里起步 (https://bbs.codeaha.com/) Powered by Discuz! X3.2