【C语言基础】运算符、表达式、语句
循环
程序设计,通过鞋码计算男人的脚长:
#include<stdio.h>
#define ADJ 7.31
int main()
{
const double SCA=0.333;
double shoe,foot;
printf("请输入你的鞋码(<=0 end):");
scanf("%lf",&shoe);
while (shoe>0)
{
foot=SCA*shoe+ADJ;
printf("你的脚长为:%.3lf!\n",foot);
printf("请输入下一个数值(<=0 end):");
scanf("%lf",&shoe);
}
}
// 注意数据类型的对应,shoe和foot定义的为double类型,下面输入输出时用lf
基本运算符
赋值运算符
在编程语言中,一般赋值运算符为:"=",语法为:a=2;所表达的含义为将2赋值给a,赋值运算从右向左进行。在赋值运算中,右值只能是字面常量,常量本身就是其值;左侧是一个变量名,赋值运算左侧必须引用一个存储位置,最简单的办法就是使用变量名。
数据对象:用于存储值的数据存储区域统称为数据对象。
const限定符:不可修改变量,在上一篇文章中提及,const所修饰的变量,为不可修改变量,可以参与运算,输出打印,但其值不能被重新赋值。
一般变量的右值可以被修改:a=2;b=3;t=a;a=b;b=t;
此外,在c语言中可以进行多重赋值:a=b=c=10;赋值过程有左向右,10先赋值给c,然后c赋值给b,b赋值给a。
数学运算符
加法运算符:"+",如a=b+c;其中a,b,c都是可赋值变量
减法运算符:"-",减法同上
符号运算符:"-",其中减号还可以改变一个值的代数符号,如a=-12;这种表示方式为一元减法运算符。
乘法运算符:"*"
除法运算符:"/"
整数除法和浮点数除法不同。浮点数除法的结果是浮点数,而整数除法的结果是整数。整数是没有小数部分的数。这使得5除以3很让人头痛,因为实际结果有小数部分。在C语言中,整数除法结果的小数部分被丢弃,这一过程被称为截断(truncation)。
运算符优先级:在计算复杂的混合运算的式子时,C语言有明确规定,通过计算符优先级来解决操作顺序问题,正如普通运算,乘除的优先级高于加减,于是先计算乘除,然后再计算加减,计算完成后,在执行由左向右的赋值运算。
其他运算符
sizeof运算符和size_f类型、
sizeof运算符以字节为单位返回运算对象的大小,一个字节为八个比特位
%求模运算符
求模运算符用于正数运算,求模运算符给出左侧正数除以右侧正数的余数。
++递增运算符
递增运算符(increment operator)执行简单的任务,将其运算对象递增1。该运算符以两种方式出现。第1种方式,++出现在其作用的变量前面,这是前缀模式;第2种方式,++出现在其作用的变量后面,这是后缀模式。两种模式的区别在于递增行为发生的时间不同。
--递减运算符
--count; // 前缀形式的递减运算符
count--; // 后缀形式的递减运算符
类型转换
1.当类型转换出现在表达式时,无论是unsigned还是signed的char和short都会被自动转换成int,如有必要会被转换成unsigned int(如果short与int的大小相同,unsigned short就比int大。这种情况下,unsigned short会被转换成unsigned int)。在K&R那时的C中,float会被自动转换成double(目前的C不是这样)。由于都是从较小类型转换为较大类型,所以这些转换被称为升级(promotion)。
2.涉及两种类型的运算,两个值会被分别转换成两种类型的更高级别。
3.类型的级别从高至低依次是long double、double、float、unsignedlong long、long long、unsigned long、long、unsigned int、int。例外的情况是,当long 和 int 的大小相同时,unsigned int比long的级别高。之所以short和char类型没有列出,是因为它们已经被升级到int或unsigned int。
4.在赋值表达式语句中,计算的最终结果会被转换成被赋值变量的类型。这个过程可能导致类型升级或降级(demotion)。所谓降级,是指把一种类型转换成更低级别的类型。
5.当作为函数参数传递时,char和short被转换成int,float被转换成double。
程序联系
1.编写一个程序
把用分钟表示的时间转换成用小时和分钟表示的时间。使用#define或const创建一个表示60的符号常量或const变量。通过while循环让用户重复输入值,直到用户输入小于或等于0的值才停止循环。
#include<stdio.h>
#define T 60
int main()
{
int time;
printf("enter time:");
scanf("%d",&time);
while(time>0)
{
printf("transform %d hours %d minute\n",time/T,time%T);
printf("once again enter time(enter 0 end):");
scanf("%d",&time);
}
return 0;
}
2.编写一个程序
提示用户输入一个整数,然后打印从该数到比该数大10的所有整数(例如,用户输入5,则打印5~15的所有整数,包括5和15)。要求打印的各值之间用一个空格、制表符或换行符分开。
#include<stdio.h>
int main()
{
int n,i=0;
printf("enter a int number:");
scanf("%d",&n);
while(i<=10)
{
printf("%d\t",n+i);
i++;
}
return 0;
}
3.编写一个程序
提示用户输入天数,然后将其转换成周数和天数。例如,用户输入18,则转换成2周4天。以下面的格式显示结果:
18 days are 2 weeks, 4 days.
通过while循环让用户重复输入天数,当用户输入一个非正值时(如0或-20),循环结束。
#include<stdio.h>
int main()
{
int day;
const int W=7;
printf("enter day number:");
scanf("%d",&day);
while (day>0)
{
printf("%d days are %d weeks, %d days.\n",day,day/W,day%W);
printf("once again enter day number:");
scanf("%d",&day);
}
return 0;
}
4.编写一个程序
提示用户输入一个身高(单位:厘米),并分别以厘米和英寸为单位显示该值,允许有小数部分。程序应该能让用户重复输入身高,直到用户输入一个非正值。其输出示例如下:
Enter a height in centimeters: 182
182.0 cm = 5 feet, 11.7 inches
Enter a height in centimeters (<=0 to quit): 168.7
168.0 cm = 5 feet, 6.4 inches
Enter a height in centimeters (<=0 to quit): 0 bye
#include<stdio.h>
int main()
{
const float DW=2.54;
float height,b,inches;
int a,feet;
printf("enter height(cm):");
scanf("%f",&height);
// 英寸inches(长度单位,等于2.54厘米,1英尺feet等于12英寸)
while (height>0)
{
a=(int)height;
b=(float)a;
inches=height/DW;
feet=((int)inches)/12;
inches=inches-feet*12;
printf("%.1f cm = %d feet, %.1f inches\n",b,feet,inches);
printf("enter height(cm):");
scanf("%f",&height);
}
return 0;
}
5.计算20天里赚多少钱的程序
假设第1天赚$1、第2天赚$2、第3天赚$3,以此类推。修改程序,使其可以与用户交互,根据用户输入的数进行计算(即,用读入的一个变量来代替20)。
#include<stdio.h>
int main()
{
int day,i,sum;
i=0;
sum=0;
printf("enter day:");
scanf("%d",&day);
while(i<=day)
{
sum=sum+i;
i=i+1;
}
printf("sum=%d\n",sum);
}
6.修改编程练习5的程序
使其能计算整数的平方和(可以认为第1天赚$1、第2天赚$4、第3天赚$9,以此类推,这看起来很不错)。C没有平方函数,但是可以用n * n来表示n的平方。
#include<stdio.h>
int main()
{
int day,i,sum;
i=0;
sum=0;
printf("enter day:");
scanf("%d",&day);
while(i<=day)
{
sum=sum+i*i;
i=i+1;
}
printf("sum=%d\n",sum);
}
7.编写一个程序
提示用户输入一个double类型的数,并打印该数的立方值,自己设计一个函数计算并打印立方值。main()函数要把用户输入的值传递给该函数。
#include<stdio.h>
void math(a)
{
printf("%d\n",a*a*a);
}
int main()
{
int a;
printf("a=:");
scanf("%d",&a);
math(a);
}
8.编写一个程序
显示求模运算的结果。把用户输入的第1个整数作为求模运算符的第2个运算对象,该数在运算过程中保持不变。用户后面输入的数是第1个运算对象。当用户输入一个非正值时,程序结束。其输出示例
如下:
This program computes moduli.
Enter an integer to serve as the second operand: 256
Now enter the first operand: 438
438 % 256 is 182
Enter next number for first operand (<= 0 to quit): 1234567
1234567 % 256 is 135
Enter next number for first operand (<= 0 to quit): 0
Done
#include<stdio.h>
int main()
{
int a,b,c;
printf("This program computes moduli.\n");
printf("Now enter the first operand:\n");
scanf("%d",&b);
fflush(stdin);
printf("Enter an integer to serve as the second operand:\n");
scanf("%d",&a);
c=b%a;
printf("%d %% %d is %d\n",b,a,c);
return 0;
}
9.编写一个程序
要求用户输入一个华氏温度。程序应读取double类型的值作为温度值,并把该值作为参数传递给一个用户自定义的函数Temperatures()。该函数计算摄氏温度和开氏温度,并以小数点后面两位数字的精度显示3种温度。要使用不同的温标来表示这3个温度值。下面是华氏温度转摄氏温度的公式:摄氏温度 = 5.0 / 9.0 * (华氏温度 - 32.0)开氏温标常用于科学研究,0表示绝对零,代表最低的温度。下面是摄氏温度转开氏温度的公式:开氏温度 = 摄氏温度 + 273.16Temperatures()函数中用const创建温度转换中使用的变量。在main()函数中使用一个循环让用户重复输入温度,当用户输入 q 或其他非数字时,循环结束。scanf()函数返回读取数据的数量,所以如果读取数字则返回1,如果读取q则不返回1。可以使用==运算符将scanf()的返回值和1作比较,测试两值是否相等。
#include<stdio.h>
const float jd=273.16;
float c_temp,k_temp;
float h_temp;
void Temperatures();
int main(){
printf("please enter h_temp:");
while (scanf("%f",&h_temp)==1)
// scanf()函数返回读取数据的数量,所以如果读取数字则返回1,如果
// 读取q则不返回1。可以使用==运算符将scanf()的返回值和1作比较,测试两
// 值是否相等。
{
Temperatures();
//c语言中函数只能有一个返回值,如果返回值大于一个,则要构建结构体
}
}
void Temperatures()
{
c_temp=5.0/9.0*(h_temp-32.0);
k_temp=c_temp+jd;
printf("c_temp=%.2f k_temp=%.2f h_temp=%.2f",c_temp,k_temp,h_temp);
}