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)时会失败。