认识运算符,表达式和语句

来源:互联网 发布:判断数组奇偶 编辑:程序博客网 时间:2024/06/03 11:28
一.循环简介
#include<stdio.h>
#define ADJUST 7.64
#define SCALE 0.325
int main(void)
{
    double shoe,foot;
    shoe=9.0;
    foot=SCALE*shoe+ADJUST;
    printf("Shoe size(men is) foot length\n");
    printf("%10.1f %15.2f inches\n",shoe,foot);
    return 0;
}


第一个程序计算了穿9码鞋男人的脚用英尺长度表示。这个程序显示不出循环的优越性,因为只计算了一只鞋子的尺码的计算。我们需要的是让计算机重复计算,反复计算鞋子的长度。
#include<stdio.h>
#define ADJUST 7.64
#define SCALE 0.325
int main(void)
{
    double shoe,foot;
    printf("shoe size(men is) foot length\n");
    shoe=3.0;
    while(shoe<18.5)
    {
        foot=SCALE*shoe+ADJUST;
printf("%10.1f %15.2f inches\n",shoe,foot);
shoe=shoe+1.0;
    }
    printf("if the shoe fits,wear it.\n");
    return 0;
}


while的工作原理为,当程序第一次到达while语句时,检验圆括号内的条件是否为真。当条件为真是,程序继续执行下一条语句,所有语句都运行完后,程序会返回while部分去检查条件,在while语句{}标出循环的范围,当中的语句是重复执行的语句,直到条件不符合while中的条件为止,这样while整个循环就结束了。
二.基本运算符
c使用运算符来代表算术运算。
1.赋值运算符:=
在c语言中,符号=不等于相等,而是一个赋值运算,例如语句
bmw=2002;
该语句的意思就是将值2002赋给变量bmw,该运算符的动作是从右到左的。记住符号=左边的项目必须是一个变量的名字,或者说是指向一个存储位置。
c语言中有几个专业的术语:数据对象,左值,右值和操作数。
数据对象是泛指数据存储区的术语,数据存储区能够用于保存值。
c的术语左值是指用于标识一个特定的数据对象的名字或者表达式,但不是所有的对象都可以更改的值,所有c中用术语“可修改的数据左值”来表示那些可以被修改的对象。
术语“右值”指的是能赋给可修改的变量左值的量,例如上面语句中的“2002”就是一个右值
#include<stdio.h>
int main(void)
{
    int jane,tarzan,cheeta;
    cheeta=tarzan=jane=68;
    printf("                  cheeta tarzan jane\n");
    printf("First round score %4d %8d %8d\n",cheeta,tarzan,jane);
    return 0;
}


本程序中用了一个3重赋值,先把68赋给jane,然后是tarzan,最后是cheeta,顺序是从右往左进行的
2.加法运算符:+
“加法运算符”使得在它两侧的值被加到一起。例如语句
prinf("%d",4+20);
将打印值24而不是表达式“4+20”
被加的值可以是变量也可以是常量
3.减法运算符:-
“减法运算符”从它的前面的数中减去它后面的数。
加法和减法运算符都是二元运算符,因为它们需要两个操作数。
4.符号运算符:-和+
负号可以用于指示或者改变一个值得代数符号。
5.乘法运算符:*
cm=2.54*inch;
用2.54乘以变量inch,然后将结果赋值给cm。
#include<stdio.h>
int main(void)
{
    int num=1;
    while(num<21)
    {
        printf("%4d %6d\n",num,num*num);
num=num+1;
    }
    return 0;
}


有的时候可能需要一个平方表,但是c中没有计算平方的函数,可以使用乘法来计算平法。
#include<stdio.h>
#define SQUARES 64
#define CROP 1E15
int main(void)
{
    double current,total;
    int count=1;
    printf("square grains total  ");
    printf("fraction of \n");
    printf("   added    grain      ");
    printf("US total\n");
    total=current=1.0;
    printf("%4d %13.2e %12.2e %12.2e\n",count,current,total,total/CROP);
    while(count<SQUARES)
    {
        count=count+1;
current=2.0*current;
total=total+current;
printf("%4d %13.2e %12.2e %12.2e\n",count,current,total,total/CROP);
    }
    printf("That is all.\n");
    return 0;
}


可以使用乘法来计算指数的增长。应用于世界人口的增长和粮食的增长。
6.除法运算符:/
c使用符号/来表示除法。/左边的值被它右边的值除。
整数的除法和浮点数除法有很大的不同。浮点数除法得出的结果为一个浮点数,而整数的除法得出来的一定为一个整数。这就使“3/5”变得很为难,程序会默认删除小数部分,这个过程被称为截尾。
#include<stdio.h>
int main(void)
{
    printf("integer division:5/4 is %d\n",5/4);
    printf("integer division:6/3 is %d\n",6/3);
    printf("integer division:7/4 is %d\n",7/4);
    printf("floating division:7./4. is %1.2f\n",7./4.);
    printf("mixed division:   7./4 is %1.2f\n",7./4);
    return 0;
}


程序中运用了一个混合类型:用一个整数去除以一个浮点数。在c中是可行的,但我们要避免这种情况的发生。实际上计算机并不能真正的用整数去除以浮点数,但是编译器可以把两个不同类型的转换为同一类型的。
7.运算符的优先级
butter=25.0+60.0*n/SCALE;
这个语句中有3种运算,但是他们的运算优先级不同。应该是先执行60.0*n(假设n=6),然后360/SCALE,最后加上25.0。如果需要先进行加法运算可以用园括号括起来例如:
butter=(25.0+60.0*n)/SCALE;
程序将先执行圆括号中的值。
常见运算符的优先级可以查表。
8.优先级和求值顺序
运算符的优先级为求值顺序提供了重要的规则,但是它没有决定所有的顺序。例如:
y=6*12+5*20;
语句中肯定是乘法的优先级高于加法,所以先进行乘法运算。但是并没有规定两个乘法的优先级,到底是第一个乘法先运算还是第二个乘法想运算我们就不得而知。
#include<stdio.h>
int main(void)
{
    int top,score;
    top=score=-(2+5)*6+(4+3*(2+3));
    printf("top=%d\n",top);
    return 0;
}


程序的执行顺序如下:
top=score=-7*6+(4+3*5)
top=score=-7*6+(4+15)
top=score=-7*6+19
top=score=-42+19
top=score=-23
top=-23
三.其他运算符
c中含有40个运算符,其中有些比较常见。
1.sizeof运算符和size_t类型
#include<stdio.h>
int main(void)
{
    int n=0;
    size_t intsize;
    intsize=sizeof(int);
    printf("n=%d,n has %zd bytes; all ints have %zd bytes.\n",n,sizeof n,intsize);
    return 0;


}


c规定sizeof返回size_t类型的值。这是一个无符号整数类型,但它不是一个新类型,它与可移植类型相同,它是根据标准类型定义的。c中有一个typedef机制,它允许你为一个已有的类型创建一个别名,例如
typedef double real;
使real成为double的别名,现在可以声明一个real类的变量
real deal;
编译器看到real就会自动转换为double类型的变量。
2.取模运算符:%
取模运算符用于整数运算。该运算符计算出用它右边的整数去除它左边的整数得到的余数。不要对浮点数实现该运算符,因为那是无效的。
#include<stdio.h>
#define SEC_PER_MIN 60
int main(void)
{
    int sec,min,left;
    printf("convert seconds to minutes and seconds!\n");
    printf("enter the number of seconds(<=0 to quit):\n");
    scanf("%d",&sec);
    while(sec>0)
    {
        min=sec/SEC_PER_MIN;
left=sec%SEC_PER_MIN;
printf("%d seconds is %d minutes,%d seconds.\n",sec,min,left);
printf("enter next value(<=0 to quit):\n");
scanf("%d",&sec);
    }
    printf("done!\n");
    return 0;
}


使用一个计数器来控制while循环,当计数器超出给定的大小,循环终止。
复数的取模规则在c99中有了定义,如果第一个操作数为负数,那么得到的模也为负数,如果第一个操作数为正数,那么得到的模也为正数。
3.增量和减量运算符:++和--
“增量运算符”完成的是简单的任务,即将其操作数的值增加。它分为前缀模式和后缀模式。这两种模式的区别在于动作发生的准确时间是不同的。
#include<stdio.h>
int main(void)
{
    int ultra=0,super=0;
    while(super<5)
    {
        super++;
++ultra;
printf("super=%d,ultra=%d\n",super,ultra);
    }
    return 0;
}


这个程序看上去和平常的不一样,我们无法体会到缩写带来的好处,但是以后一旦代码过多就有所体现。
这种方法的好处有:它更加简洁,会产生更加高效的机器语言代码。缺点是代码更加难以理解并且容易产生错误。
#include<stdio.h>
int main(void)
{
    int a=1,b=1;
    int aplus,plusb;
    aplus=a++;
    plusb=++b;
    printf("a aplus b plusb\n");
    printf("%ld %5d %5d %5d\n",a,aplus,b,plusb);
    return 0;
}


该程序体现出前缀和后缀的区别了。
aplus=a++; 后缀,先使用a的值,然后改变a
plusb=++b; 前缀,先改变b的值,然后改变b
合理使用前缀和后缀可以使你看上去更加专业。
我们可以使用科学点的方法来避免错误例如
b=++i;
改为
++i;
b=i;
4.减量:--
和++一样的定义和用法
#include<stdio.h>
#define MAX 100
int main(void)
{
    int count=MAX+1;
    while(--count>0)
    {
        printf("%d bottles of spring water on the wall %d bottle of spring water!\n",count,count);
printf("take one down and pass it around,\n");
printf("%d bottles of spring water!\n\n",count-1);
    }
    return 0;
}


5.优先级
增量和减量运算符有很高的结合优先级,只有圆括号比它们的优先级高。
建议:1.如果一个变量出现在同一个函数的多个参数中时,不要将增量或者减量运算符用于上面。
      2.当一个变量多次出现在一个表达式里时,不要将增量或者减量运算符用于到它的上面。
四.表达式和语句
1.表达式
表达式是由运算符和操作数组合构成的。每一个表达式都有一个值。赋值语句的值很好判读,但是那些非赋值语句的值可以用“条件为真时值为1,条件为假时值位0”来判读。
2.语句
语句是构造程序的基本成分。程序是一系列带有某种必需的标点的语句集合。
语句和表达式的区别在于“x=3”是表达式而“x=3;”为语句。
#include<stdio.h>
int main(void)
{
    int count,sum;
    count=0;
    sum=0;
    while(count++<20)
    sum=sum+count;
    printf("sum=%d\n",sum);
    return 0;
}


声明语句用于建立变量的名称和类型并导致它们分配内存空间,但他并不是一个表达式。
赋值语句为变量分配一个值,它的结构是一个变量名,变量后面紧跟着一个赋值运算符,然后是一个表达式,最后一个分号结尾。
函数语句是引起函数的执行。
while语句属于一类被称为“结构化的语句”。
3.副作用和顺序点
副作用是c的术语,是对数据对象或者文件的修改。例如
states=50;
c语言认为把50赋值给states是该语句的副作用,而它的主要作用是对表达式求值。
一个顺序点是程序执行中的一点:在该点处,所有的副作用都在进入下一步前被计算。在c中,语句中的分号标志一个顺序点,它意味着一个语句所有的运算在下一句语句前全部发生。任何一个完整的表达式的结束也是一个顺序点。一个完整的表达式定义为它不是一个更大的表达式的子表达式。
4.复合语句(代码块)
复合语句是使用花括号组织起来的两个或者更多的语句,也被称为一个代码块。
五.类型转换
c可以自己转换一些基础的类型,但也有如下规则:
1.当出现在表达式里时,有无符号的char和short类型都将自动被转换为int,在需要的情况下,将自动转换为unsigned int,float将自动转换为double。因为都是转换为大数据,所以这些转换都被称为提升。
2.在包含两种数据类型的任何运算里,两个值都被转换为两种类型里面较高的级别。
3.类型级别从高到低为:long double,double,float,unsigned long long,longlong,unsigned long,long,unsigned int和int。
4.赋值语句,计算的最后结果被转换成将要被赋予值得那个变量的类型。
5.当作为函数的参数被传递时,char和short会被转换为int,float会被转换为double.
#include<stdio.h>
int main(void)
{
    char ch;
    int i;
    float fl;
    fl=i=ch='A';
    printf("ch=%c,i=%d,f1=%2.2f\n",ch,i,fl);
    ch=ch+1;
    i=fl+2*ch;
    fl=2.0*ch+i;
    printf("ch=%c,i=%d,fl=%2.2f\n",ch,i,fl);
    ch=5212205.17;
    printf("Now ch=%c\n",ch);
    return 0;
}


提升通常是一个无损害的过程,但是降级可能导致程序显示的错误,因为类型不够大,可能有的时候无法装下。
通常我们应该避免自动的类型转换,尤其是降级。我们可以通过指派的方法完成类型的转换,其步骤是在某个量的前面放置用圆括号括起来的希望转换成的类型名。例如:
mire=(int)1.6+(int)1.7
六.带有参数的函数
#include<stdio.h>
void pound(int n);
int main(void)
{
    int times=5;
    char ch='!';
    float f=6.0;
    pound(times);
    pound(ch);
    pound((int)f);
    return 0;


}
void pound(int n)
{
    while(n-->0)
        printf("#");
    printf("\n");
}


参数和参量的区别:对实际参数或者实际参量使用术语参数,对形式参量或者形式参数使用术语参量。在函数中的变量名字是局部的,这意味着在一个函数里定义的名字不会与其他地方的名字发生冲突。
原型是一个函数声明,它描述了函数的返回值和它的参数。
七.总结程序
#include<stdio.h>
const int S_PER_M=60;
const int S_PER_H=3600;
const double M_PER_K=0.62137;
int main(void)
{
    double distk,distm;
    double rate;
    int min,sec;
    int time;
    double mtime;
    int mmin,msec;
    printf("This program converts your time for a metric race\n");
    printf("to a time for running a mile and to your average\n");
    printf("speed in mile per hour.\n");
    printf("Please enter,in kilometers,the distance run.\n");
    scanf("%lf",&distk);
    printf("Next enter the time in minutes and seconds.\n");
    printf("begin by entering the minutes.\n");
    scanf("%d",&min);
    printf("Now enter the seconds.\n");
    scanf("%d",&sec);
    time=S_PER_M*min+sec;
    distm=M_PER_K*distk;
    rate=distm/time*S_PER_H;
    mtime=(double)time/distm;
    mmin=(int)mtime/S_PER_M;
    msec=(int)mtime%S_PER_M;
    printf("You ran %1.2f km(%1.2f miles)in %d min,%d sec.\n",distk,distm,min,sec);
    printf("That pace corresponds to running a mile in %d min,",mmin);
    printf("%d sec.\n Your average speed was %1.2f mph.\n",msec,rate);
    return 0;


}
0 0
原创粉丝点击