嵌入式学习 Day3

一 . 编程的基本原则

       1. 编程的思路

           输入----->计算机处理----->输出

           三步走:输入数据                                                                                                                                             处理数据                                                                                                                                             输出反馈 

       2. 高内聚,低耦合     

           尽可能的将不同的功能模块分开书写。这利于修改调试,可将部分程序的错误对整体程序               的影响降到最低。

       3. 成对书写

           ""   ()    <>   {} 

        保持良好的书写习惯很重要!

 二 . 字符型的一些补充

        1.字符型变量的定义

           char c = 'a'       // 这是规范的

           char c= 'abc'    // 这样只会打印出 'c' ,这是因为char只有一个字节的空间,而根据计算机小                                          端存储的方式,'c' 被存储在低地址处,仅'c' 已占满char开辟的空间,'ab'                                        将不会被存储

           int c = 'abc'       // 这样会打印出 'abc' ,int 有四个字节空间,而字符数据与整型数据是通用                                           的

           int c = 0x616263    // 效果与上式一致

嵌入式学习 Day3_第1张图片

        2. 转义字符(不会有具体字符的表现,但能感受到其作用

            eg:    \n         //  这是一个字符,不是两个

嵌入式学习 Day3_第2张图片

 补充:%%        打印为%

              嵌入式学习 Day3_第3张图片

 

         3. 字符常量

              'a'
             '\141'      // 这是一个字符
             '\x61'

 三 . C 中的运算

        1.运算符

           +
           -
           * 
           / 
                   //  注意:   1.除数不能为0
                                                2.整型数相除 --- 相当于是整除
          % 取余           //  注意: 1.浮点型不能做求余运算 
                                                2.求余运算 第二操作数 不能是 0 
                                                3.求余运算的结果的符号 取决于 左操作数的符号

                                    作用:a. 判断奇数偶数?
                                                  a%2 ==?
                                               b. a%N 结果 [0~N-1]
          ++                   //  注意:  1. 浮点数也能自增自减 
           --                                   2. ++,-- 运算数 必须是左值 (变量)
                                                3. 尽量避免printf("%d%d\n",i,++i);不要写出这种不确定的代码 
                                                4.op.c: In function ‘main’:
                                                   op.c:82:4: error: lvalue required as increment operand
                                                   10++;
                                                    lvalue (left value)    //左值   --- 能放在 = 左边的这些量                                                                                                                    (其实就是变量)
           另外要注意:

          (1)关于左值的新定义 

                    int a;
                    a = 10; 

                    constant   // 常量的意思 
                    const int a = 10;  // a 只读变量 ---只能读 不能修改 
                    左值 (lvalue -- locationable) //可定位的   ---能不能被定位到 
                    printf("%p/n",&a)               //取地址指令,获得a所在空间的首地址编号(以16进制)                                                                        能取到地址就是左值,取不到就是右值(常量是右值)
                    表达式、匿名变量   //都是右值,无法定位  

          (2)求余的应用

                  eg: 100道题 ? //0~99 
                        随机除10道题?

嵌入式学习 Day3_第4张图片

嵌入式学习 Day3_第5张图片

          (3)i++,++i 的辨析

                   单独的i++、++i都相当于i=i+1         // i++

                   运算中的i++、++i            //   a = i++

                   i++    //先用(表达式的结果) ,后加 (后对i加1)      有一个开辟临时空间的动作

                                                                                                      
                   ++i    //先加(先对i加1) ,后用 (表达式的结果)      没有这个动作(效率更高

嵌入式学习 Day3_第6张图片

          (4)贪心原则
                   从左到右逐个字符的扫描表达式,看这些字符能否尽可能多的结合成c的运算符 
                  不能结合,就还是字符本身
       
                   i+++++i                //
                   i ++ ++ + i            //
                   i++ ++ +i              // 
                   (((i++)++) + i)       //

        2.表达式

           eg:1+2          //由运算符 和 运算数 构成字符序列

           所有的表达式都是有结果的(值),

           表达式一定是有数据类型的 (因为其结果必然对应某一种数据类型)

           表达式怎么看?
          1.有哪些运算符
          2.运算符的:优先级  
                               结合性 

              eg: 10+'a'+1.5 — 8765.1234 *'b'
                       10 + 'a' + 1.5 - (8765.1234 *'b')           //优先级 (优先级越高,越先结合运算数)
                       (((10 + 'a') + 1.5) - (8765.1234 *'b') )   //结合性 
                           10 + 'a'
                            int  int
                                      (double - double )      //表达式最终值是一个double型数值

              eg:char w; int x; float y; double z;
                     则表达式w*x+z-y所求得值的数据类型为______________。  

                     (((w * x) + z )- y)
                    char * int 
                       int * int => int 
                            (double - double) //double

嵌入式学习 Day3_第7张图片

嵌入式学习 Day3_第8张图片

        3.隐式类型转换

                          嵌入式学习 Day3_第9张图片

             规则: 从右向左: 必转 (从C99开始不再要求float必转为double)
                       从下到上: 低精度类型 与 高精度类型混合运算                                                                                                    此时 低精度 往 高精度转

             注意:1.从C99标准开始不再要求float必转为double,运算过程中还是转了,只是最后输                               出又转回float

                        2.对于float必转是为了计算结果更精确                                                                                                   对于char、short必转是为了防止溢出,为其留足空间

               嵌入式学习 Day3_第10张图片

嵌入式学习 Day3_第11张图片

        4.强制类型转换

           (类型)表达式

            eg:(int) (123.456) =123

嵌入式学习 Day3_第12张图片

嵌入式学习 Day3_第13张图片

        5.运算类型

           赋值运算: =
           赋值运算表达式的的结果,就是左值获得的值的 

           int a;
           a = 10;  
           (a=(b=(c=1)))

           +=
            -=
            *=  //赋值运算 
            a += 1  // a = (a + 1)

           逗号运算: 顺序求值运算符 
           形式: 表达式1,表达式2, ...,表达式n 
           逗号表达式的结果: 是最后一个表达式的结果 

你可能感兴趣的:(学习,linux)