0
点赞
收藏
分享

微信扫一扫

C语言学习day3——表达式、运算符

快乐小码农 2022-03-19 阅读 92

目录

学习目标:

学习内容:

整型数据的范围

实型数据范围区别

 字符型数据

字符常量

字符变量

转移字符

转义字符的使用

字符串常量

变量赋初值

不同类型数据混合运算

强制类型转换

运算符

基本运算符

自增‘自减运算符

赋值运算符

逗号运算符

题目练习


学习目标:

补充整型和实型数据知识

理解字符型数据(字符常量,字符串变量,转义字符等)

理解各种运算符(赋值,运算等)


学习内容:

整型数据的范围

#include <stdio.h>

void main()
{
      short int a,b;
      a = 32767;
       b = a+1;
       printf("%d,%d\n",a,b);
}

 

32767 :   0111  1111  1111  1111
-32768:  1000  0000  0000  0000

2^15=32768,可以看出范围为(-2^15)——(2^15-1)

实型数据范围区别

#include<stdio.h>

void main()
{
  double  a,b;
  a = 123456.789e5;
  b=a+100;
  printf("%f\n",a);
  printf("%f\n",b);
}


#include<stdio.h>

void main()
{
  float  a,b;
  a = 123456.789e5;
  b=a+100;
  printf("%f\n",a);
  printf("%f\n",b);
}

 

 可以看出,double与float的范围不同,举例为正,首位还有符号位。

#include <stdio.h>
void main()
{

   printf("%f",1.0/3);
}

 字符型数据

字符常量

用单引号括起来的一个字符。例如  ‘a’ ,  ‘b’ ,  ‘=’ ,  ‘+’   都是合法的字符常量

在C语言中,字符常量有以下特点:

1.字符常量只能用单引号括起来,不能用双引号或其他括号

2.字符常量只能是单个字符,不能是字符串

3.字符可以是字符集中任意字符,但数字被定义为字符型之后就不能参与数值运算。

如  ‘5’和 5  是不同的。‘5’ 是字符常量,不能参与运算。

字符变量

字符变量用来存储字符常量,即单个字符。

字符变量的类型说明符是char。字符变量类型定义的格式和书写规则都与整型变量相同。

例如:Char a ,b ;

转移字符

     转义字符是一种特殊的字符常量。转移字符以反斜杠 “\”开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称为 “转义”字符。例如,在前面各例题printf 函数的格式中用到的 “\n” 就是一个转义字符,表示的是“回车换行”。转义字符主要用来表示那些用一般字符不便于表示的控制代码。

转义字符输出结果
\n换行将光标移到下行开头
\f换页将光标移到下页开头
\t水平制表符将光标移到下个Tab位置
\v垂直制表符将光标移到下个垂直制表对齐点
\b退格将光标后退一个字符
\r回车将光标移到本行开头
\\

反斜线\

输出\
\'单引号输出'
\"双引号输出"
\?问号输出?
\a警告产生声音
\ddd八进制输出与d数相同位数的八进制数(1~3)
\xhh

十六进制

输出与h数相同位数的十六进制数(1~2)

每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。字符值是以ASCII码的形式存放在变量的内存单元之中的。 如x的十进制ASCII码是 120, y的ASCII码是121。对字符变量a,b,赋予’x’和’y’值: a = ‘x’ ; b =  7 ;实际上是在a,b两个单元内存放 120 和55 的二进制代码。

转义字符的使用

#include<stdio.h>

void main()
{
      int a,b,c;
      a =5;b = 6; c = 7;
      printf("ab  c\tde\rf\n");
      printf("hijk\tL\Bm\n");
}

 ASCII码表

 

 

字符串常量

是由一对双引号括起的字符序列,例如“CHINA”,”C program”

字符串常量和字符常量是不同的量。他们之间主要有以下区别:

1.字符常量由单引号括起来,字符串常量由双引号括起来。

2.字符常量只能是单个字符,字符串常量则可以含一个或多个字符。

3.可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。

例如: 可以char a = ‘a’   但是不能 char a = “a” ;

4.字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数+1. 增加的一个字节中存放字符 “\0”(ASCII 码为0),这是字符串结束的标志。

例如"a"和'a'

a\0

占两个字节

a

占一个字节

变量赋初值

类型说明符   变量1 = 值1,变量2 = 值 2, ······;例如:   

 int b ,c = 5;

    float x = 3.2,y=3f,z = 0.75;

    char chl = ‘K’, ch2 = ‘P’;

不同类型数据混合运算

变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。自动转换发生在不同的数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则。

1.若参与运算量的类型不同,则先转换成同一类型,然后进行运算。

2.转换按数据长度增加的方向进行,以保证精度不降低。如int 型和long 型运算时,先把int 量转成long 型后再进行运算。

3.所有的浮点型运算都是以双精度进行的,即使仅含有float单精度运算的表达式,也要先转换成double型,再作运算。

4.Char型和 short型参与运算时,必须先转换成int 型。

t b ,c

在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。

如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分将四舍五入向前舍入。

类型自动转换的规则:

 

#include<stdio.h>

void main()
{
     float PI = 3.14159 ;
     int s ,r  = 5;
     s = r * r * PI;
     printf("s = %d \n",s);


}

= 5;

 PI 为实型, s,r 为整型。 在执行 s = r * r*PI  语句时,r 和 PI 都转换成double 型计算,结果也为 double 型。 但由于s 为 整型, 故赋值结果仍为整型, 舍去了小数部分。

强制类型转换

     强制类型转换是通过类型转换运算来实现的。

其一般形式为:

(类型说明符) (表达式)

其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。

例如:

    (float)a     把 a 强制转换为实型

   (int )(x+y)  把x+y的结果转换为整型

在使用强制转换时应注意以下问题:

1.类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int )(x+y)写成 (int)x+y 则表示把x 转换成int 型之后再与 y 相加了。

2.无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。float x = 3.2,y=3f,z = 0.75;

 

#include<stdio.h>

void main()
{
     float f = 5.75;
     printf("(int)f = %d , f = %f \n",(int)f ,f);
}

  char chl = ‘K’, ch2 = ‘P’;

float虽然强制转换为int 型,但只在运算过程中起作用, 是临时的。

而f 本身的类型没有改变,因此 ,(int)f 的值为5,而 f 的值仍然为5.75 。

运算符

基本运算符

1.加法运算符“+”:加法运算符为双目运算符,即应有两个量参与加法运算。

如A+b , 4+8等,具有右结合性。

2.减法运算符 ”-” : 减法运算符为双目运算符。但 “-”也可作为负值运算符,此时为单目运算符,

如 -5, -x 等具有左结合性。

3.乘法运算符 “ * ” :双目运算符,具有左结合性,

4.除法运算符“/”:双目运算符具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。 如果运算量中有一个是 实型,则结果为双精度实型。

 

运算符的优先级: C语言中,运算符的运算优先级共分为15级,1级最高,15级最低。在表达式中,优先级较高的先于优先级教低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。

运算符的结合性: C语言中各运算符的结合性分为两种,即左结合性(自左向右)和右结合性(自右向左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式 x-y+z 则y应先和 “-”号结合,执行 x –y 运算,然后再执行 +z 的运算。这种自左至右的结合方向称为 “左结合性”。而自右向左的结合方向称为“右结合性”。最典型的有结合性运算符是赋值运算符。如 x=y=z,由于“=”的右结合性,应 先执行 y=z 再执行 x=(y=z)运算。C语言运算符中有不少为右结合性,应注意区别,以避免理解错误

自增‘自减运算符

++i   :i 自增1后参与其他运算

--i     : i 自减1后在参与其他运算

i++   : i 参与运算后,i 的值再自增1

i --    :   i 参与运算后,i 的值再自减 1

#include<stdio.h>

void main()
{
       int i =8;
   printf("%d \n",++i);
   printf("%d \n", --i);
   printf("%d \n",i++);
   printf("%d \n",i--);
   printf("%d \n",-i++);
   printf("%d \n",-i--);

}

 

赋值运算符

简单赋值运算符和表达式: 简单赋值运算符记为 “=”。

由 “=”连接的式子称为赋值表达式。其一般形式为 : 变量= 表达式。

例如:x = a + b   ,    x = sin(a) + sin(b)

如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型转换成左边的类型。具体规定如下:

1.实型赋予整型,舍去小数部分。前面的例子已经说明了这种情况。

2.整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分值为0)

3.字符型赋予整型,由于字符型为一个字节,而整型为四个字节,故将字符的ASCII码放到整型量的低八位中,高八位为0,整型赋予字符型,只把低八位赋予字符量。

复合赋值符

在赋值符 “=”之前加上其他的双目运算符可构成复合赋值符。

如 +=, -=,*=, /=,>>=, <<=, &= ,^=, ! =

例如: a+ = 5;  等价与  a = a+5;

      x* = y+7 ;  等价于 x =x*(y+7)

复合赋值符这种写法,十分有利于编译处理,能提高编译效率并产生质量较高的目标代码

逗号运算符

在C语言中 “  ,  ”也是一种运算符,称为逗号运算符。其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。

其一般形式为:   表达式1 , 表达式2

其求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。

对于逗号表达式还要说明两点:

1.逗号表达式一般形式中的表达式1 和表达式 2 也可以又是逗号表达式。

例如:     表达式1 ,(表达式2,表达式3)

形成了嵌套情形。因此可以把逗号表达式扩展为以下形式:

               表达式1,表达式2,….表达式N

整个逗号表达式的值等于表达式N的值

2.程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。

并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中逗号只是用作各变量之间的间隔符

#include<stdio.h>

void main()
{
         int a = 2,b =4 , c =6,x ,y ;
         y = ((x= a+b),(b + c));
         printf("y = %d,x = %d",y,x);
}

#include<stdio.h>

void main()
{
         int a = 2,b =4 , c =6,x ,y ;
         y = (x= a+b),(b + c);
         printf("y = %d,x = %d",y,x);
}


 

题目练习

给出三角形三边,求面积

#include<stdio.h>
#include<math.h>

void main()
{
 double a,b,c,s,area;
 a=3.67;
 b=5.43;
 c=6.21;
 s=(a+b+c)/2;
 area=sqrt(s*(s-b)*(s-a)*(s-c));
 printf("a=%f\tb=%f\tc=%f\n",a,b,c);
 printf ("area=%f\n",area);

}

 

举报

相关推荐

0 条评论