10-15日(第七周周一)上课简记

   计算机归根结底所做的事情只有一件,就是计算。而最简单的计算就是算术运算。我们上小学就开始接触算术运算。

1.算术运算符及表达式

1.1 常用的算法运算符有:加“+”,减“-”,乘“*”,除“/”和取余“%”。

#include<stdio.h>
int main()
{
	int i=24,j=7,k;
	double t=3.0,m;
	k=i+j;
	m=i+j;
	printf("k=%d,m=%lf\n",k,m);
	k=i/j;
	m=i/j;
	printf("k=%d,m=%lf\n",k,m);
	m=24/3.0;
	printf("m=%lf\n",m);
	return 0;
}

C语言规定:参与运算的数据均为整型时,结果为整型。例如:k=i+j; k=i/j;
C语言规定:参与运算的数据中有一个数为实型,则结果为double。
例如:m=i/t;t为double类型,所以i/t的值也为double类型。将该值赋给double类型的m,数据不会丢失。

1.2 取余(或求余)运算符:%

含义:**a%b,求的是a与b相除之后的余数。**也称a对b求余,或a对b取模。

#include<stdio.h>
int main()
{
	int i=24,j=7,k,m;
	k=i%j;
	m=i%3.0;
	printf("k=%d,m=%d\n",k,m);
	k=(-i)/j;
	m=(-i)%j;
	printf("k=%d,m=%d\n",k,m);
    k=i/(-j);
	m=i%(-j);
	printf("k=%d,m=%d\n",k,m));
	return 0;
}

运行上述程序,编译器提示什么错误?如果修改程序?
C语言规定:参加求余的两个操作数必须是整型。
实例:输出一个三位整数的个位、十位和百位数字。
关键:如何分离出个位、十位和百位数字?
思路:153/100=1得到的结果就是百位。153%10=3得到个位。
153-1*100=53,这样十位就是最高位,继续53/10=5得到。
另一种:153%100=53,53/10=5
问题:求余运算还有什么用?
C语言的随机函数rand()可以生成一个在0至32767之间的随机数,如果我们想生成一个指定范围(如1~100)内的随机数呢?
可以对:magic=rand()%100; //0~99
magic=rand()%100+1就可以生成1~100之间
生活中的求余运算例子
一天是24小时,我们说几点了,就是对24取余得到的。 此外,取余还能判断某数是否能被整除。
如何进行更复杂的数学运算呢?
常用的标准数学函数:
函数名 功能
exp(x) e的x次方
pow(x,y) x的y次方
sqrt(x) x的平方根(x>=0)
fabs(x) X的绝对值
log(x) Inx,(x>0)
sin(x) sinx,x为弧度值
使用这些函数时,需要在程序开头加上:#include<math.h>

1.3自加和自减运算符

#include<stdio.h>
int main()
{
	int i=24,j=7;
	i++;
	j--;
	printf("i=%d,j=%d\n",i,j);
	i=24;j=7;
	++i;
	--j;
	printf("i=%d,j=%d\n",i,j);
	return 0;
}

运行该程序,看看两条输出语句输出的结果是什么?结果一样吗?
自加运算符:++。使变量的值加1之后重新写回到变量中。
自减运算符:- -。使变量的值减1之后重新写回到变量中。
操作数只能是变量,也称为自增运算符或自减运算符。
前缀:++n等价于n=n+1; --n等价于n=n-1
后缀:n++等价于n=n+1; n–等价于n=n-1
思考:增1运算符无论是作为前缀还是后缀,其作用均让变量增1,那为何还要区分前缀和后缀呢?

#include<stdio.h>
int main()
{
	int i=24,j=24,m,n;
	m=i++;
	n=++j;
	printf("m=%d,n=%d\n",m,n);
	printf("i=%d,j=%d\n",i,j);
	i=24;j=24;
	printf("%d,%d\n",--i,j--);
	printf("%d,%d\n",i,j);
	return 0;
}

运行上述程序,分析运行结果。
作为前缀时:先对n增1或减1,然后再使用n的值。例如:n=++j; 等价于:j=j+1;n=j; 对于大多数编译器来说,采用自增运算符程序执行效率较高。例如:printf(“%d”,–i);
作为后缀时,先使用n的值,然后再对n增1或减1。例如:m=i++; 等价于:m=i;i=i+1; 对于大多数编译器来说,采用自增运算符程序执行效率较高。例如:printf(“%d”,j–);
又比如: printf(“%d”,-(n++));等价于 printf(“%d”,-n); n=n+1;
**注意:**增1和减1运算生成的代码效率更高一些。但是过多的增1和减1运算混合的话就会产生副作用,例如:m=(++n)+(n++)程序的可读性变差,很难分析出来n的变化规律,此外不同的编译器产生的运行结果是不同的。
良好的程序设计风格提倡:在一行语句中,一个变量最多只出现一次增1或减1运算

3.赋值运算符及表达式

#include<stdio.h>
int main()
{
	int i=24,j,m;
	j=m=4; 
	i=i+3;
	j+=4;
	printf("i=%d,j=%d\n",i,j);
    m+=m-=m*m;
    printf("m=%d",m);
	return 0;
}

运行程序,分析结果。弄明白语句:j=m=4;j+=4; m+=m-=m*m;的含义是什么?
前面我们说过,int a;这条语句的意思是声明了一个整型变量a。
通过a=3; 这条语句可以给a赋值。“=”就是赋值运算符,看上去和数学中的等号相同,在数学里面:a=3的意思是a的值是3,a的值和3是相等的。但在c 语言中,赋值运算符是有方向性的,表示将3赋值给a
简单赋值:变量=表达式;例如int a; a=3;
多重赋值:变量=变量=表达式;
例如:int a,b; a=b=3;赋值运算符的结合性是右结合性,相当于a=(b=3),先执行b=3,再执行把表达式b=3的值赋值给a.
思考:a=a+10;从数学上看,这个表达式是错误的。但在C语言中,是将a+10的值赋给a。相当于对右侧的a执行读操作,对左侧的a执行写操作。可以写成a+=10;+=是复合赋值运算符。
例如:a-=3;等价于a=a-3;
初始化:int a=3;等价于int a;a=3;
前面提到:a=b=3;但不可以int a=b=3; 可以写成:int a=3,b=3;

4.关系运算符及其表达式

关系运算符用来比较两个量的大小关系。C 语言提供的关系运算符有:<,<=,>,>=,==,!=。关系表达式的值是逻辑值:真或假,在程序中用1表示真,用0表示假。
关系运算符都是双目运算符,结合性均为左结合性。
例如:8<2>5;先计算8<2,结果为0,再计算0>5,关系表达式的值为0。

#include<stdio.h>
int main()
{
	int i=24,j=7,m;
    m=24>7;
	printf("(1)m=%d\n",m);
    m=24>7>3;
    printf("(2)m=%d\n",m);
    m=24>7<=8;
    printf("(3)m=%d\n",m);
    m=(i==j);
    printf("(4)m=%d\n",m);
    m=i!=j;
    printf("(5)m=%d\n",m);
	return 0;
}

运行程序,看看输出结果。
分析下面程序;

#include<stdio.h>
int main()
{
	double i=24,j=7,k,m;
    k=i/j*j;
    if(i==k)
       printf("i is equal k\n");
   /* if(fabs(i-k)<1e-6)
       printf("i is equal k\n");*/
	return 0;
}

思考:实数如何进行相等或不等的判断???
下列程序的功能是判断i和j是否相等。对否???

#include<stdio.h>
int main()
{
	int i=24,j=7;
    if(i=j)
       printf("i is equal j\n");
    else
       printf("i is not equal j\n");
	return 0;
}

5. 逻辑运算符

逻辑运算符用于逻辑运算,运算符有三个:!逻辑非,&&逻辑与,||逻辑或。C语言没有逻辑类型数据,当进行逻辑判断时,如果数据的值为0,则认为逻辑假,如果数据的值为1,则认为逻辑真。同理,逻辑表达式的值为真时,用1表示,反之用0表示。

扫描二维码关注公众号,回复: 3655249 查看本文章
#include<stdio.h>
int main()
{
	int i=24,j=7,m;
    m=i&&j;
    printf("(1)=%d\n",m);
    m=i||j;
    printf("(2)=%d\n",m);
    m=!i;
    printf("(3)=%d\n",m);
	return 0;
}

运行程序,观察m的值??把i和j的值改变一下,再看看程序运行结果??
思考:在现实生活中,经常会出现闰年,所谓的闰年就是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。接下来编写一个程序,使用逻辑运算符与if语句判断年份是闰年还是平年。
闰年:输入年号,能被400整除,则是闰年;如果能被4整除,而不能被100整除,则是闰年;其他情况均不是闰年。

#include<stdio.h>
int main()
{
	int year,flag;
	printf("please input year:");
	scanf("%d",&year);
	if(year%400==0)
	  flag=1;
	else
	{
		if(year%4==0&&year%100!=0)
		  flag=1;
		else
		  flag=0;
	 } 
	 if(flag==1) 
		printf("%d is a leap year!\n");
	 else
	 	printf("%d is not a leap year!\n");
	return 0;
}

这个程序将算术运算符、关系运算符、赋值运算符、逻辑运算符均运用到了。

6.条件运算符(唯一的一个三目运算符)

例如:要判断两个整型的大小,输出较大者。

#include<stdio.h>
int main()
{
	int a,b,max;
	printf("please input a,b:");
	scanf("%d%d",&a,&b);
	max=a>b?a:b;
	printf("max=%d\n",max);	
	return 0;
}

其实,该程序可以有很多种实现方法。

7.sizeof运算符

该运算符用于测试数据类型所占的字节数。

#include<stdio.h>
int main()
{
	int a=45;
	printf("%d\n",sizeof(a));
	printf("%d\n",sizeof(int));	
	printf("%d\n",sizeof(45));
	return 0;
}

均输出了int型所占的内存字节数。

8.混合运算时数据类型的转换

8.1 系统自动进行类型转换(隐式转换)

算术表达式中,相同类型数据的运算结果的类型还是该类型。不同类型数据的运算结果的类型是:取值范围较大的那种类型。
C99标准:long double<—double<—float<—unsigned long<—long<—unsigned int<—int
而char 和short在进行混合运算时均先转为int。
int +float-——>float+float。编译器把int型直接转换为float,就可以参与运算了。
特例:long+unsigned int
long类型表达的数据的上限值为2147483647,而unsigned int表达的数据的上限值为4294967295,如果把unsigned int 转换为long,可能会造成溢出,因此编译器会将二者均转换为unsigned long,然后进行运算。
设计转换规则是因为高级别的类型所占的字节数大,可以避免在运算过程中造成数据的丢失。

8.2 类型显式转换

有时这种隐式的自动类型转换,可能不是程序员的本意,如何显式地表明程序员的意图呢?
可采用显式转换,也称为强制转换。

#include<stdio.h>
int main()
{
	int total=15,number=2; 
	float aver;
    aver=(float)total/number;
	printf("(1)%f\n",aver);
	aver=(float)(total/number);
	printf("(2)%f\n",aver);	
	return 0;
}

运行程序,分析结果。

猜你喜欢

转载自blog.csdn.net/lvcongying0601/article/details/83055155
今日推荐