简单的算术运算和表达式

来源:互联网 发布:l-sql语句like约束 编辑:程序博客网 时间:2024/04/28 07:38

            第三章   简单的算术运算和表达式

1.条件运算符是C语言提供的唯一一个三元运算符,C语言中没有幂运算符

2.只有计算相反数是一元运算符,其余运算符都是二元运算符

3.一元运算符也叫单目运算符,二元运算符也叫双目运算符,三元运算符也叫三目运算符

4.整数除法的结果是整数,浮点数除法的结果是浮点数

5.求余运算限定参与运算的两个操作数必须为整型,余数的符号与被除数的符号相同,不能对两个实型数进行求余运算

6.所有的算术运算符中只有一元的去相反数运算符为右结合,其余的结合性都为左结合

7.同一优先级的运算符进行混合运算时,从左向右依次进行

8.运算符的优先级:单目运算>算术运算>关系运算>逻辑运算>条件运算>赋值运算>逗号运算

9.计算并输出一个三位整数的个位、十位、百位数字之和

#include<stdio.h>

void main()

{

int x=321;

int a,b,c,sum;

a=x%10;//a=1

b=(x/10)%10;//b=2

c=x/100;//c=3

sum=a+b+c;

printf("a=%d,b=%d,c=%d\nsum=%d\n",a,b,c,sum);

}

10.涉及算术运算的复合赋值运算符有5个:+=,-=,*=,/=,%=

11.1运算符也称自增运算符,减1运算符也称自减运算符,都是一元运算符,只有一个操作数必须是变量不能是常量或表达式

12.自增自减运算符作为前缀时,先执行加1或减1然后使用;自增自减运算符作为后缀时,先使用再执行加1或减1

13.考虑优先级与结合性的实例

m=-n++=m=-(n++)=m=-n,n=n+1;

//正面:-++都是一元运算符,优先级相同,此时要考虑结合性,结合性都是右结合的,所以先算++后算-

//反面:如果等价m=(-n)++就不合法了,因为表达式不能进行自增操作

14.scanf函数和printf函数都是C的标准输入/输出函数,&为取地址运算符

15.宏常量与宏替换:

    1) 在程序中直接使用的常数称为幻数,将幻数定义为宏常量或const常量是为了提高程序的可读性和可维护性

2) 宏常量也称符号常量,没有数据类型,编译器不对其进行类型检查,只进行字符串替换

    3) 宏定义一般形式:#define 标识符 字符串。标识符被称为宏名,宏名与字符串之间可有多个空白符,不加等号,结尾不加分号

    4) 宏常量是由宏定义编译预处理命令来定义,宏名替换成字符串的过程称为宏替换,宏替换不做任何语法检查

5) 当宏定义是一个表达式时,调用时,是一个数就可以直接带入,而是表达式也要看成是一个数代进宏定义表达式中,

   而看成一个数这就要求把调用的数加上圆括号,为了减少不必要的错误,最好都加上圆括号

6) 宏替换的过程是将宏名原样替换成字符串,而不是直接计算出值,所以要用调用后的结果参与其他运算就需要把调用的结果加上圆括号

7) 例题:

#include<stdio.h>

#define N 2            //N=2

#define M N+1          //M=2+1

#define NUM 2*M+1      //NUM=2*2+1+1=6

void main()

{

int i;

for(i=1;i<=NUM;i++);

printf("%d\n",i); //执行完空循环,i=7

i--;                //  i=6

printf("%d\n",i);

}

   8) 例题:

#include<stdio.h>

#define f(x) x*x

void main()

{

int b;

b=f(4+4);           //b=4+4*4+4=24,解释见5)

printf("b=%d\n",b);

}

   9) 例题:

#include<stdio.h>

#define f(x) x*x

void main()

{

int b;

b=f(4+4)/(2+2);     //b=4+4*4+4/(2+2)=21解释见6)

printf("b=%d\n",b);

}

  10) 例题:

#include<stdio.h>

#define f(x) x*x

void main()

{

int b;

b=f((4+4));         //b=(4+4)*(4+4)=64

printf("b=%d\n",b);

}

  11) 例题:

#include<stdio.h>

#define f(x) (x*x)

void main()

{

int b;

b=f((4+4))/(2+2);   //b=((4+4)*(4+4))/(2+2)=16

printf("b=%d\n",b);

}

16.const常量

    1) const常量只能在定义时赋初值,因为编译器将其放在只读存储区,不允许在程序中修改

2) const常量的定义一般形式:const 类型名 标识符=字符串;//将标识符声明为具有该数据类型的const常量

3) const是一种类型修饰符,const常量具有数据类型,编译器要对其进行类型检查

17.表达式中的自动类型转换:

    1) 表达式中,操作数类型相同,运算的结果类型与操作数类型相同

2) 表达式中,操作数类型不相同,C编译器自动将所有操作数进行类型提升,转换成同一类型,所占字节最大,再计算

18.赋值中的自动类型转换:

    1) 赋值运算符左侧变量与右侧表达式类型不同时,发生自动类型转换:右侧表达式的值转换成左侧变量的类型

19.强制类型转换:

    1) 强制类型转换运算符是一元运算符

2) 强制类型转换也称强转,是将表达式的值转换为任意类型,并不改变变量本身的数据类型

3) 强转一般形式:(类型)表达式

4) 演示强制类型转换运算符的使用

#include<stdio.h>

void main()

{

int m=5;

printf("m/2=%d\n",m/2);//m=2

printf("(float)(m/2)=%f\n",(float)(m/2));//m=2.000000

printf("(float)m/2=%f\n",(float)m/2);//m=2.500000

printf("m=%d\n",m);//m=5,只是将m强转为实型数据,并不改变m的数据类型

}

20.常用的标准数学函数:

    1) 使用C标准数学函数,要在程序开头加上编译预处理命令:#include<math.h>

2) 例:已知三角形三边长为a,b,c,计算三角形的面积

#include<stdio.h>

#include<math.h>

void main()

{

float a,b,c,s,area;

printf("Input a,b,c:");

scanf("%f,%f,%f",&a,&b,&c);

s=(a+b+c)/2;

area=(float)sqrt(s*(s-a)*(s-b)*(s-c));

printf("area=%f\n",area);

}

21.赋值运算符的左侧不能出现表达式,变量与变量之间可以赋值

 

   例1:若有定义:int a,b,c;下列表达式中哪一个是合法的C语言赋值表达式(CD

   A)a=7+b=c=7    B)a=b++=c=7    C)a=(b=7,c=12)     D)a=3,b=a+5,c=b+2  

//A.7+b表达式不能做左值  B.b++表达式不能做左值  C.逗号表达式a=12  D.依次赋值

 

   例2:下面不正确的赋值语句是(B)

   A)a=++a        B)a=b++=10     C)a+=b      D)a=1>'a'

//D.算术运算符优先级高于赋值运算符,先算1>'a'再将其结果赋给a

 

   例3:若有下列定义:int a=3,b=2,c=1;以下选项错误的赋值表达式是(A)

   A)a=(b=4)=3    B)a=b=c+1      C)a=(b=4)+c        D)a=1+(b=c=4)

//A.先计算圆括号里的值等于4,然后按照赋值表达式的顺序从右向左计算,将3赋值给4这是不对的,

  即赋值号左侧只能是变量,不能出现表达式b=4

 

 

0 0
原创粉丝点击