《c primer plus》第五章:运算符,表达式,语句

P103 shoes1.c

#include<stdio.h>
#define ADJUST 7.31   //字符常量 
int main(void){
	const double SCALE =0.333;   //const变量 
	double shoe,foot;
	
	shoe=9.0;
	foot=SCALE*shoe+ADJUST;
	printf("shoe size  (men's)   foot length\n");
	printf("%10.1f %15.2f inches\n",shoe,foot);
	
	return 0;
} 

运行结果:
在这里插入图片描述
P104 shoes2.c 加入while循环

#include<stdio.h>
#define ADJUST 7.31
int main(void){
	const double SCALE =0.333;
	double shoe,foot;
	
	printf("shoe size men's     foot length\n");
	shoe=3.0;
	while(shoe<18.5)
	{
		foot=SCALE*shoe+ADJUST;
		printf("%10.1f %15.2f\n",shoe,foot);
		shoe++;
	}
	printf("wear it");
	return 0;
	
} 

运行结果:
在这里插入图片描述
while循环中,{ } 花括号中的内容是需要重复执行的内容,称为块,条件为真时执行这些语句

运算符:
c用运算符表示算术运算(operator)

=:赋值运算符,赋值行为从右往左进行。
2002=bow;这样的语句是无效的,=左侧必须引用一个存储位置,c使用可修改的左值标记那些可赋值的实体。

+:加法运算符
-:减法运算符:income=salary+bribesd 注意salary和bribes都是可修改的左值,但表达式salary+bribes是一个右值。
+和-运算符都被称为二元运算符,及需要两个操作对象。

P109 wheat.c

#include<stdio.h>
#define SQUARES 64
int main(void){
	const double CROP=2E16;
	double current,total;
	int count=1;
	
	printf("square     grains     total     ");
	printf("friction of\n");
	printf("          added     grains     ");
	printf("world total\n");
	total=current=1.0;
	printf("%4d %13.2e %12.2e %12.2e\n",count,current,total,total/CROP);
	while(count<SQUARES)
	{
		count++;
		current=2.0*current;
		total=total+current;
		printf("%4d %13.2e %12.2e %12.2e\n",count,current,total,total/CROP);		
	}
	
	return 0;
}

在这里插入图片描述
/除法运算符:在c语言中整数除法结果的小数部分被直接丢弃,这一过程称为截断。
例:5/4=1
7./4=1.75 //编译器会把两个运算对象转化成相同的类型,即整型被转为浮点型
对于负数,有趋零截断,即-3.8=-3;

运算符结合律:例:12/3*2; //和/优先级相同,并且共用运算对象3,结合律规定从左往右计算为42=8、

sizeof以字节为单位返回运算对象的大小,1字节等于8位

//使用sizeof运算符
#include<stdio.h>
int main(void){
	int n=0;
	size_t intsize;
	
	intsize=sizeof(int);  //运算对象是类型必须加括号
	printf("n=%d  n has %d bytes  all ints have %d bytes",n,sizeof n,intsize);
	
	return 0;
} 

//c有一个typedef机制 typedef double real; //即real是double的别名,size-t即是如此
。例:11/5=2 11%5=1
11/-5=-2 11%-2=1
-11/-5=2 -11%-5=-1
-11/5=-2 -11%5=1

递增运算符:++
P117 post-pre

/*前缀与后缀*/
#include<Stdio.h>
int main(void){
	int a=1,b=1;
	int a_post,b_post;
	
	a_post=a++;
	b_post=++b;
	printf("a   a_post   b   b_post\n");
	printf("%d%5d%5d%5d",a,a_post,b,b_post);
	
	return 0;
} 

运行结果:
在这里插入图片描述
注意前缀与后缀的区别:后缀:使用a之后再加1 while(a++<18.5) //先比较后加1‘
前缀:先加1后使用a

注: 只有圆括号的优先级大于自增自减运算符。
2.如果一个变量出现在一个函数的多个参数中,不要对他使用自增自减运算符,因为编译器可以自行选择先对哪个参数求值
3.如果一个变量多次出现在一个表达式中,不要对他使用自增自减运算符。
例子:

//自增在函数参数中多次出现的测试
#include<stdio.h>
int main(void){
	int num=1;
	
	while(num<=10){
		printf("%d %d\n",num,num*num++);
	}
	return 0;
} 

运行结果:
在这里插入图片描述
表达式和语句: c的基本程序步骤由语句构成,而大多数语句都由表达式构成c的表达式的最重要的特性是,每个表达式都要有一个值
语句(statement)是c程序的基本构建模块,一条语句便是一条完整的计算机指令,在c中大部分语句都已:结尾,,,例如: legs=4是一个表达式 legs=4;便是一条语句
注意:声明如果后面的分号若被删除,剩下的部分不是一个表达式。

复合语句,是用花括号括起来的一条或多条语句,也称为块(block)

类型转换: 若在语句或表达式中使用混合类型c不会像pascal那样死掉,而是采用一套规则进行自动类型转换。

P125 convert.c

#include<stdio.h>
int main(void){
	char ch;
	int i;
	float f1;
	
	f1=i=ch='C';
	printf("ch=%c i=%d f1=%2.2f\n",ch,i,f1);
	ch=ch+1;
	i=f1+2*ch;
	f1=2.0*ch+i;
	printf("ch=%c i=%d f1=%2.2f\n",ch,i,f1);
	ch=1107;
	printf("now ch=%c",ch);
	ch=80.89;
	printf("now ch=%c",ch);
	
	return 0;
}

在这里插入图片描述
1.当类型转换出现在表达式时,char和short都会转为int。由小到大被称为升级
2。涉及两种类型的计算,两个值会被分别转换为两种类型更高的级别。
3.在赋值表达式语句中,计算结果会被转换为被赋值变量的类型,可能会导致升级或降级。
4.作为函数参数传递时,char,short被转为int,float被转为double。

强制类型转换: 例: int mice; mice=1.6+1.7 //mice的值为3.3去掉小数部分
mice=(int)1.6+(int)1.7 //mice的值为1+1=2

P127 pound.c 带参数的函数

//定义一个带参数的函数
#include<stdio.h>
void pound(int n);  //ANSI函数原型声明 
int main(void){
	int times=5;
	char ch='!';
	float f=6.0f;
	
	pound(times);
	pound(ch);
	pound(f);
	
	return 0;
} 

void pound(int n)   //ANSI风格函数头
{
	while(n-->0){
		printf("#");
	}
	printf("\n");
 } 

在这里插入图片描述
在函数头void pound(int n)中,若函数不接受任何参数,应在括号中写上void 。声明参数就创建了名为形参的变量,在函数调用中传递的值被称为实际参数。
**注:**变量名是函数私有的

原型即是函数的声明,描述了函数的返回值和参数类型,在ANCSI C之前使用的是函数声明而不是函数原型,例void pound();即只指明函数名和返回类型而不指明参数类型,这样在第三次调用pound(f)时会失败。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值