C primer plus——C进阶探幽


前言

本章介绍以下内容

关键字——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;
}

运行结果我们可以看到

aa_postbpre_b
2122

 虽然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;
}


总结

本章内容较为简单,需要注意的是一些基本概念的掌握,编程练习题值得多去思考第八题和第九题。尽量做到能独立思考并且流畅的完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值