TOM 发表于 2017-4-30 13:27:35

C语言--学习笔记--第九课

main(){
      int c = 0x20;
      char a;
      while(c < 0x80)
      {
                if(c!= 0x20 && c%16 == 0)
                {
                        printf("\n");
                }
                if(!(c%16))
                {
                        printf("%x0H: ",c/16);
                }
                printf("%c",c++);
      }
      printf("\nPlease input num: ");
      scanf("%c",&a);
      printf("a is %c\n",a);         
      if('A' <= a && a<= 'Z')         /*千万不要写成('a'<= c <= 'z')*/
      {
               /* a += 0x20;*/
                c = c | 0x20;
      }
      else
      {
                if('a' <= a && a <= 'z')    /*千万不要写成('a'<= c <= 'z')*/
                {
                     /* a -= 0x20;*/
                        c = c & 0xdf;
                }

      }
      printf("a is new %c",a);

}

这是C语言的逻辑('a'<= c && c <= 'z')这是数学逻辑('a'<= c <= 'z');不要想当然的用数学逻辑让编译器执行,编译器不认;下次一定注意;

A 0x41:0100-0001
a 0x61:0110-0001

相差0x20;

布尔运算:(按位操作 0 < - > 1)   

或运算(|):只要有一个为1,结果为1;
x | z == 1
0   1 == 1
1   0 == 1

c = c | 0x20;

与运算(&):只要有一个为0,结果为0;
x & z == 0
1   0 == 0
0   1 == 0

c = c & 0xdf;

取反(~):

char a = 0x64;
a = ~a;

异或运算(^):
01//1
10
00//0
11
相同的0;不同得1;

A 0X64
B 0X32
A ^ B
0110-0100A
0011-0010B
-------------
0101-0110C
0011-0010B
-------------
0110-0100A

A^B得到结果c;那么A、B、C三者之间任意两个数异或都会得到第三个数;

======================================================================
main()
{
      char i = 0;
      char * str = "Hello,Nisy!";
      for(; i < 10;i++ )
      printf("%X",*(str + i));
      printf("\n%s",str);
}
把"Hello,Nisy!"存储在*str内存里面;printf("%x",*(str + i));打印的时候%x是小写就出入小写,反之亦然;
-----------------------
main()
{
      int i;
      char a;   /*现申请15个字节*/
      for(i = 0; i < 15 ;i++)
      {
                a = 'a';    /*把这15个字节都赋值为a*/
      }
      for(i = 0; i < 15 ;i++)
      {
                printf("%c",a);    /*把这15个为a字节的数据打印出来*/
      }
      printf("\n");
      scanf("%10s",a);   /*scanf("%s");%s之间必须要设定长度*/
      printf("%s\n",a);   /*%s为字符串*/
      for(i = 0; i < 15 ;i++)
      {
                printf("%2X",a);        /*输入数据后,把输入的数据按16进制输出;疑问:%x和%2x之间的关系?*/
      }
      printf("\n");
      i = 0;
      while(a != 0)        /*测试一下是否字符串是以0结果的,遇到0停止打印*/
      {
                printf("%c",a);
                i++;
      }

}

结论:%s输出字符串,在内存中字符串是以0结果的;
=============================================================================
封装函数:
void showstr(char * str)
{
      int i=0;
      while(str)
      {
                printf("%c",str);
                i++;
      }
      printf("\n");


}


main()
{
      int i;
      char str;
      for(i = 0; i < 20; i++)
      {
                str = 'a';
      }
      scanf("%10s",str);
      showstr(str);
      for(i = 0; i < 20; i++)
      {
               if(str >= 'A'&& str <= 'z')
               {
                        str |= 0x20;
               }
      }

      showstr(str);

}

把      
      int i=0;
      while(str)
      {
                printf("%c",str);
                i++;
      }
      printf("\n");
这段重复的代码封装成一个函数,在调用的时候直接写showstr(str);就可以不需要再重新打一遍代码;
---------------------------------------
用goto解释for()循环:
main()
{
      int i;
      /*for(i = 0 ; i < 10 ; i++)
      {
                printf("%d",i);
      }       */

      i = 0;
      /*while(i < 10) */
while_start:                   /*先在定义开始的标号*/
      if(i < 10)                                        /*判断条件是否满足*/
                goto while_ok;/*如果满足条件就跳到while_ok;这句执行*/
      else
                goto while_end;/*否则就跳到while_end;这句执行*/

      {
while_ok:                        /*while_ok;的代码*/
                printf("%d",i);
                i++;
                goto while_start;    /*执行完后跳到while_start;这里*/
      }
while_end:                           /*结束*/
      i = i + 1;
mark:
      i = 1 + 2;
      printf("\n");
}

--------------
程序中 每一个函数 都需要在main()外部申请一些空间来实现函数的调用和返回;

每一个函数 都需要以下的空间长度:
        参数的空间;
        函数的返回地址;


第九课最后还拆解了上面的封装函数;(未写)
页: [1]
查看完整版本: C语言--学习笔记--第九课