嵌入式学习Day3 C语言 --- 转移字符、运算符、类型转换

一、用代码来完成一个任务时中间要经过的过程

人类的思维 ----> 计算机的思维 ----> 编程语言表达出来

过程描述:输入(准备数据) --->  计算机处理(处理数据) ---->输出 (输出结果 )

例如:现在有一个任务是在计算机上实现将hello 转换成大写输出 

//1.准备数据 
定义5个char类型的变量 
c1,c2,c3,c4,c5
//2.处理数据 
分别将c1,c2,c3,c4,c5 
减32 
//3.输出结果 
打印结果 

 画个流程图:

嵌入式学习Day3 C语言 --- 转移字符、运算符、类型转换_第1张图片

二、转义字符及其作用

转义字符:将反斜杠"\"后面的字符转换成另外的意义。如 "\n" 中的 "n" 不代表字母而作为“换行”符

嵌入式学习Day3 C语言 --- 转移字符、运算符、类型转换_第2张图片

重点描述一下 '\t' 

'\t' 从当前单元格的中此时的位置跳到另一个单元格的起始位置(一个单元格有8列,即一个单元格可放8个字符)

这里直接给出例子

 printf("abcdefghk\t#k\n");  
//123456781234567812345678  //位置参考
//abcdefghk       #k        //打印结果
//                          //'\n'的换行效果

 printf("123\t456"); 
//123456781234567812345678  //位置参考
//123     456               //打印结果

'\b'  光标从当前位置移动到前一列(光标位置代表从这里输入数据)

这里直接给出例子

 printf("123 \b456\n");  //打印结果123456                            

 printf("123\b456\n");   //打印结果12456

'\r' 光标从当前位置移动到第一列

这里直接给出例子

printf("123 \r456\n");   //打印结果456                         

printf("123\r456\n");    //打印结果456

' \\' 代表一个反斜杠字符

例如想打印出 \n

printf("\\n");    //打印结果\n

' \' ' 代表一个单引号字符

例如想打印出 ‘ n ’

printf("\'n\'");  //打印结果 'n',(标准C)

printf("'n'");    //打印结果 'n',(不通用)

' \" ' 代表一个单引号字符

例如想打印出 " n "

printf("\"n\"");  //打印结果 "n"

练习

123\t\\9\'\12312\x12         //一共有11个字符

123\t\\9\'\12312\x123        //error 0x123太大

\ddd 八进制代表的字符,大小不能超过ASCII码中的最大值,\xdd同理

三、运算符 表达式

常用的运算符:+        -        *        /         %(取余)

表达式:由运算符 和 运算数 构成

     eg:1+2
//所有的表达式都是有结果(值)的
//表达式一定是有数据类型的

---------------------------------------------------------------------------

常用运算符说明:

/ 除法 
  注意:
     1.除数不能为0
     2.整型数相除 --- (取整数,舍去后边小数)

eg:10/3  得到的结果是 3

        涉及隐式类型转换,int / int 得到的结果肯定是int型,所以是3

%  取余
  注意:
     1.浮点型不能做求余运算 
     2.求余运算 第二操作数 不能是 0 ,0对任何数求余都是0
     3.求余运算的结果的符号 取决于 左操作数的符号 

eg:

       -10%3 得 -1

       -10%-3 得 -1

        10%3 得 1

        10%-3 得 1

 a是任意数
 有 a%N 结果 [0~N-1]

eg :

     a % 10 结果是 [0~9]

     a % 100结果是[0~99]

++   自加
--     自减 

前置后置在没有参与其他运算时表达结果一样,都是自加一

在参与其他运算时才有先用在加或先加再用,包括参与函数调用时也符合这个规则

int a = 3;

printf("%d",a++);  //打印结果是3

注意:
注意:

  1. 浮点数也能自增自减 
  2. ++,--运算数 必须是左值 (变量)
  3. 注意 尽量避免
     printf("%d%d\n",i,++i);
     不要写出这种不确定的代码 ,因为C标准没有做详细规定,所以不同编译环境下结果可能不同
  4. 左值 (lvalue -- locationable)   //可定位的   --- 能被定位到(有自己得地址)
                                                   //左值   --- 能放在 = 左边的这些量(error)
     检验一个变量是不是左值,可是试着printf("%p",a);  看是否存在地址,有地址就是左值
  5. 右值  非左值  

四、运算符的优先级、结合性

嵌入式学习Day3 C语言 --- 转移字符、运算符、类型转换_第3张图片

嵌入式学习Day3 C语言 --- 转移字符、运算符、类型转换_第4张图片

五、隐式类型转换 (在计算过程中发生)

嵌入式学习Day3 C语言 --- 转移字符、运算符、类型转换_第5张图片

规则:从右向左,必转(在计算过程中)(eg:char ch,short a,计算机自动将变量ch和a转换为int型)
           从下到上:低精度类型 与 高精度类型混合运算时 低精度 往 高精度转(低精度直接转高精度,不用一步一步来)

	int a = 10;
	char ch = 'a';
	float f = 3.14;

	printf("%f",a + ch + f);  //这里用%f来打印原因是存在隐式类型转换
                              //由于必转所以'a'是int类型
                              //a+ch+f是混合运算所以是低精度向高精度转,外加运算的优先级与结和性
                              //((a+ch)+f) --> ((int)+float) --> float
                              //最终计算的结果是float类型,所以用%f打印

-------------------------------------------------------------------------------------

	10+'a'+1.5 — 8765.1234 *'b'
   
    10 + 'a' + 1.5 - (8765.1234 *'b')  //优先级 
	
	(((10 + 'a') + 1.5) - (8765.1234 *'b') ) //结合性 
	
    (((int + int) + double) - (double * int)  --> double
             必转    必转        必转    必转

--------------------------------------------------------------------------------------

给123.45678得到123.45

错误示范:
float a = 123.45678;
printf("%.2f",c);      //打印结果123.46 (%.2f四舍五入保留两位小数)

正确示范:
float a = 123.45678;  
int b = a*100;         // b = 12345
float c = b/100.0;     // c = 123.450 000
printf("%.2f",c);        // 打印结果是123.45
eg:设有以下定义,并以赋予了确定的值:
    char w; int x; float y; double z;
    则表达式w*x+z-y所求得值的数据类型为_____double____

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

六、强制类型转换格式:(类型)表达式 

强制类型转换,使得表达式结果的类型转换为你想要的类型

int a = 10;
printf("%f",(float)a); //把整形a强制类型转换为float型

---------------------------------------------------------------

printf("%d", 123.456); //err
printf("%d", (int)123.456); //123

----------------------------------------------------------------

float a = 123.45;
printf("%d",(int)a);  // 123
printf("%f",a);       // 123.450 000
可见强制类型转换只是临时用了一下,用完后回归原类型

----------------------------------------------------------------

% 左右两个都必须是int类型
想对浮点型使用%,可将浮点型强制类型转换为整形,就可以%

----------------------------------------------------------------

七、贪心原则 

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

八、赋值运算和赋值时的类型转换

1、赋值运算:
      =
      +=
       -=
       *=  

eg:a += 1     // a = (a + 1)


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

int a;
a = 10;            //结果 a = 10

int a=b=c=1;
(a=(b=(c=1)))   //结果 a = 1,b = 1,c = 1
 
3、赋值运算的要求:左右两边做到 类型匹配 
 
4、不同类型的数据间混合赋值 

int = double  //高精度给低精度赋值 精度丢失 (损失)
              // 例如:int a = 3.14;  此时打印出来a的结果是3
double = int  //低精度给高精度,没啥影响 ,单纯的就是数据变为double型  
              // 例如:double d = 3;  此时打印出来d的结果是3.000000

5、同类型不同长度的数据混合赋值

int 
short 
long 
long long 

short  = int   // 长类型数据 给到  短类型   --   高位截断 
int  =  short  // 短类型 给 长类型                                                                                                                          // 无符号 短类型  此时 补码高数据位补 0
                // 有符号 短类型  补码高数据位 符号位扩展                                                                                         (十六进制,八进制原码反码补码相同)

九、逗号表达式

1、形式:
      表达式1,表达式2, ...,表达式n

2、逗号表达式的结果:
      是最后一个表达式的结果 

 3、逗号运算: 顺序求值运算符 
 
 

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