目录
前言
本章介绍以下内容
关键字——while、typedf;
运算符——=、-、/、%、++、--、(类型名);
C语言的各种运算符;
复合语句、强制类型转换;
编写带参函数;
一、基本运算符
5.2.1 赋值运算符 =
在C语言中=不意味着相等,而是意味着赋值运算
int bmw;
bmw=2002;
上面就是一个很好的例子,首先声明一个int类型的变量bmw,然后通过赋值运算符=将右侧的值2002赋值给左侧的bmw整型变量;
还有例如
i=i+1;
这同样意味着将=右侧的值赋值给左侧的i。但是这里稍有不同,这里是先将原本的变量i的值找出然后与1相加,得到一个新的值,然后将这个新的值赋值给左侧的变量i;相当于对变量i做了一个数据更新;
数据对象,左值,右值,运算符
赋值表达式的目的是将值存储到内存位置上,而用于存储值得数据存储区域统称为数据对象;
左值:它指定一个对象,可以引用内存中的地址,并且可以用在赋值运算符得左侧;
需要注意得是,左值应该是可以修改得左值,例如通过define宏定义的值我们是不能通过赋值运算符更改值的。
右值:指的是能赋值给可修改左值的量,并且本身不是左值。
5.2.2 加法运算符+
用于加法运算,使其两侧的值相加。
相加的运算对象可以是常量也可以是变量,例如
income=salary+bribes;
i=4+20;
都是合法的。
其他运算符不做过多详细介绍,与基本的数学知识相通。
#include <stdio.h>
int main() {
int i, b, a, c;
i= 4, b=3;
a= i+b;
c= i*a;
float p, k;
p= i/b;
k= i%a;
printf("a=%d,c=%d,p=%f,k=%f\n",a,c,p,k);
return 0;
}
运算符优先级
正如我们平时计算数学算式一样:先乘除后加减,有括号先运算括号......
我们的C语言中也有规定的运算操作顺序
5.3 其他运算符
sizeof运算符和size_t类型
sizeof运算符以字节为单位返回运算对象的大小,C语言规定,sizeof返回size_t类型的值,这是一个无符号整数类型的值,但是他不是新类型。
5.3.2 求模运算符 %
求模运算符只能用于整数运算,给出左侧整数除以右侧整数所得到的余数,也叫做取余运算符。
对于求模运算符我们需要了解概念即可,简单记忆便可使用,接下来介绍较为重要的运算符
5.3.3 自增运算符
自增运算符有两种形式,一种是前缀形式,一种是后缀形式
下面将使用程序来讲解
#include <stdio.h>
int main()
{
int a=1,b=1;
int a_post,pre_b;
a_post=a++;//后缀递增
pre_b=++b;//前缀递增
printf("a a_post b pre_b \n");
printf("%1d %5d %5d %5d\n",a,a_post,b,pre_b);
return 0;
}
运行结果我们可以看到
a | a_post | b | pre_b |
2 | 1 | 2 | 2 |
虽然a,b都进行了自增,但是我们可以看到
对于a_post=a++;
最后得到的值a_post为1,这是因为对于后缀自增,会先使用值然后才对操作对象进行自增,
也就是a_post=a++相当于先将a的值做赋值运算,所以a_post的值为1,然后才对a进行自加,这时候a的值为2,所以输出结果是,a_post为1,即自加前的值,a为2,即自加后的值;
对于pre_b=++b
该式相当于是先进行自加,然后进行赋值运算,也就是b自加后为2,然后进行赋值所以pre_b也为2;
对于一个智能的编译器来说,++x与x=x+1的地位是等价的。
5.3.4 自减运算符
自减运算符的介绍参考自增运算符,同样是对操作对象有两种顺序,一个前缀自减,一个后缀自减。
对于a_post=a--;
这里首先做赋值运算,然后才递减,所以a_post的值为1,而a的值为0;
对于pre_b=--b
这里首先做自减运算,然后再赋值,所以pre_b的值为0,b的值为0;
优先级
自增运算符和自减运算符都具有很高的优先级,只有圆括号的优先级比他们的优先级高,
例如x*y++的意义是x*(y++),不是(x*y)++。当然(x*y)++是无效的,因为自增和自减运算符只能影响一个变量(左值),显然x*y不是一个可修改的左值,他是一个表达式。
表达式
表达式由运算符和运算对象组成,而运算对象由变量、常量、以及二者的组合构成。
下面都属于表达式
4 | 相当于(+)4:有运算符正号,运算对象常量4 |
-6 | 有运算符负号,运算对象常量6 |
q>3 | 有运算符大于号,运算对象常量6和变量q |
注意不要以为正负号不是运算符,正负号是一元运算符,作用是改变其右侧值的符号;
加减运算符则是二元运算符,将其两侧的值做加减运算;
5.4 复合语句(块)
用花括号括起来的一条或者多条语句,复合语句也称为块。
5.5 类型转换
一、自动类型转换
在进行运算时,不同类型的数据要转换成同一类型。自动转换的规则如图
转换方法为:
float型数据自动转换成double型;
char与short型数据自动转换成int型;
int型与double型数据运算,直接将int型转换成double型;
int型与unsigned型数据、直接将int型转换成unsigned型;
int型与long型数据,直接将int型转换成long型。
二、赋值转换
如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。转换的基本原则如下。
将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。
将实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。如x为整型变量,执行“x=4.25”时,取值为x=4。
同类型的短数据赋值给长变量,自动转换是正确的,例如,char和short型数据给int型变量赋值。
同类型的长数据给短变量赋值可能出错。例如,当unsigned int型的值超过了int变量的取值范围,赋值会出错
三、强制类型转换
可以利用强制类型转换运算符将一个表达式转换成所需类型。如:
(double)x/*将x转换成double型*/
(int)(a+b)/*强制将a+b的值转换成整型*/
(float)(10%3)/*将10%3的值转换成float型*/
强制类型转换的一般形式为:
(类型名)(表达式)
二、编程练习
1.
#include <stdio.h>
#define PULL 60
int main()
{
int minutes;
int hour;
printf("Please input the minute you need to transformation:");
while((scanf("%d",&minutes))==1 && minutes>0)
{
int m;
hour=minutes/PULL;
m=minutes%PULL;
if(m<10)
{
printf("The time is %d:0%d",hour,m);
}
else
{
printf("The time is %d:%d",hour,m);
}
}
return 0;
}
2.
#include <stdio.h>
int main()
{
int a=0,i;
printf("please input an integer:");
scanf("%d",&i);
while(a++<11)
{
printf("%d\n",i++);
}
return 0;
}
3.
#include <stdio.h>
const int pull=7;
int main()
{
int days;
printf("please input the days:\n");
while((scanf("%d",&days)&&days>0)==1)
{
if (days<7)
{
printf("%d days are 0 weeks, %d days.\n",days,days);
}
else
{
printf("%d days are %d weeks, %d days.\n",days,
(int)(days/pull),days%pull);
}
}
return 0;
}
4.
#include <stdio.h>
#define CM_PER_INCH 2.54f
#define CM_PER_FEET 30.48f
int main()
{
int feet;
float cm, inch;
printf("Enter a height in centimeters: ");
while ((scanf("%f", &cm) == 1) && (cm > 0))
{
feet = (int)(cm / CM_PER_FEET);
inch = (cm - CM_PER_FEET * feet) / CM_PER_INCH;
printf("%.1f cm = %d feet, %.1f inches\n", cm, feet, inch);
printf("Enter a height in centimeters (<=0 to quit): ");
}
printf("bye\n");
return 0;
}
5.
#include <stdio.h>
int main()
{
int n, sum, count;
sum = 0;
printf("Enter the number of days you work: ");
scanf("%d", &count);
n = count;
while (count > 0)
{
sum += count;
count--;
}
printf("You earned $%d in %d days.\n", sum, n);
return 0;
}
6.
#include <stdio.h>
int main()
{
int n, sum, count;
sum = 0;
printf("Enter the number of days you work: ");
scanf("%d", &count);
n = count;
while (count > 0)
{
sum += count * count;
count--;
}
printf("You earned $%d in %d days.\n", sum, n);
return 0;
}
7.
#include <stdio.h>
void count(double a)
{
printf("%g", a * a * a);
}
int main()
{
double num;
printf("please input a num: \n");
scanf("%lf", &num);
count(num);
return 0;
}
8.
#include <stdio.h>
int main(void)
{
int a, b;
printf("This program computes moduli.\n");
printf("Enter an integer to serve ");
printf("as the second operand: ");
scanf("%d", &b);
printf("Now enter the first operand: ");
while ((scanf("%d", &a) == 1) && (a > 0))
{
printf("%d %% %d is %d\n", a, b, a % b);
printf("Enter next number for first operand (<= 0 to quit): ");
}
printf("Done\n");
return 0;
}
9.
#include <stdio.h>
void Temperatures(double f_t);
int main()
{
double temp;
printf("Please enter a temperature number (q to quit): ");
while (scanf("%lf", &temp) == 1)
{
Temperatures(temp);
printf("You can enter again (q to quit): ");
}
printf("Done.\n");
return 0;
}
void Temperatures(double f_t)
{
const double f_val = 32.0;
const double k_val = 273.16;
double t = 5.0 / 9.0 * (f_t - f_val);
//↑摄氏温度 = 5.0 / 9.0 * (华氏温度 - 32);
double k_t = t + k_val;
//↑开氏温度 = 摄氏温度 + 273.16;
printf("Centigrade temperature: %.2lf°C\n", t);
printf("Fahrenheit temperature: %.2lf°C\n", f_t);
printf("Kelvin temperature: %.2lf°C\n", k_t);
return;
}
总结
本章内容较为简单,需要注意的是一些基本概念的掌握,编程练习题值得多去思考第八题和第九题。尽量做到能独立思考并且流畅的完成。