C语言程序设计---3:顺序程序设计

时间:2021-06-02 23:33:35

赋值表达式

赋值运算符按照“自右而左”的结合顺序运算。因此

  • a = (b = 5);
  • a = b = c;
  • a = 5 + (c = 6); a = 11
  • a = (b = 4) + (c = 6); a = 10;
  • a = (b = 10)/(c = 2); a = 5;
  • (a = 3*5) = 4*3; 先将15赋给a,然后执行4*3运算,得到12,再把12赋给a。
  • a = 3*5 = 4*3;语法错误,因为 3*5 不是左值。

将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中,例如:

  • printf(“%d”,a = b);

赋值过程中的类型转换

#include<stdio.h>
void main()
{
int a = 23;
float f = a; /*会有warning*/
printf("%f\n",f);
double d = a; /*不会有warning*/
printf("%lf\n",d);
d = f; /*不会有warning*/
printf("%lf\n",d);
d = 123.456789e2;
f = d; /*会有warning*/
printf("%lf\n",f);
a = 2.365; /*会有warning*/
printf("%d\n",a);
}

结果:

23.000000
23.000000
23.000000
12345.678900
2

将一个占字节多的整型数据赋给一个占字节少的整型变量或字符变量(例如把一个4字节的long型数据赋给一个2字节的short型变量,或将一个2字节的int型数据赋给1字节的char型变量),只将其低字节原封不动地送到该变量(即发生截断)。

例如:

#include<stdio.h>
void main()
{
int i = 289;
char c = 'a';
c = i;
printf("%d\n",c);
}

结果为:!
因为!的ASCII码为33.

i = 289 0000 0001 0010 0001
c = 33 0010 0001

如果将一个有符号整数赋给无符号整型变量,或将一个无符号整数赋给有符号整型变量,是按照存储单元字节中原样传送的。

int a = 3,b = 3,c = 3;      正确
int a = b = c = 3; 错误

数据输入输出的概念

printf和scanf

printfscanf不是C语言的关键字,而只是库函数的名字。

编辑、编译、连接、运行一个C语言程序的具体过程如下:  

  1. 编辑源程序,完成之后将源程序以扩展名.c存盘。
  2. 对源程序进行编译,即将源程序转换为扩展名为.obj的二进制代码。若源程序有错,必须予以修改,然后重新编译。
  3. 对编译通过的源程序连接,即加入库函数和其他二进制代码生成可执行程序。连接过程中,可能出现未定义的函数等错误,为此,必须修改源程序,重新编译和连接。
  4. 执行生成的可执行代码,若必能得到正确的结果,必须修改源程序,重新编译和连接。若能得到正确的结果,则整个编辑、编译、连接、运行过程顺利结束。

C语言源程序经过编译得到目标文件(obj文件),然后与各软件公司提供的系统函数库(已被编译成obj文件)相连接,生成一个可执行的目标程序(exe文件)。如果源程序中有printf函数,在编译时并不把它翻译成目标指令,而是在连接阶段与系统函数库相连接后,在执行阶段调用函数库中的printf函数。

不把输入输出作为C语句的目的,是使C语言编译系统简单,因为将语句翻译成二进制的指令是在编译阶段完成的,没有输入输出语句就可以避免在编译阶段处理与硬件有关的问题,可以使编译系统简化,而且通用性强,可移植性好,在各种型号的计算机和不同的编译环境下都能适用,便于在各种计算机上实现。

C语言函数库有一批“标准输入输出函数”:

putchar (输出字符)
getchar (输入字符)
printf (格式输出)
scanf (格式输入)
puts (输出字符串)
gets (输入字符串)

include

#include <stdio.h>,编译系统在程序编译时从存放C库函数头文件的子目录中去找所要包含的文件(如stdio.h),这称为标准方式。
#include “stdio.h”,在编译时,系统现在用户当前目录中寻找要包含的文件,若找不到,再按标准方式查找。如果文件不在当前目录中,可以 #include “C:\temp\filel.h”

字符数据的输入输出

#include<stdio.h>
void main()
{
char a,b,c;
a = getchar();
b = getchar();
c = getchar();
putchar(a);
putchar(b);
putchar(c);
putchar('\n');
}

结果:
输入 boy 输出boy
输入 b+enter+o 输出b换行o enter为换行

如果程序改成这样

#include<stdio.h>
void main()
{
putchar(getchar());
putchar(getchar());
putchar(getchar());
putchar('\n');
}

结果:
输入 boy 输出boy
输入 b+enter 输出b+换行 输入o+enter 输出b

简单的格式输入和输出

%f:用来输出实数(包括单、双精度),以小数形式输出,可以不指定输出数据的长度,由系统自动指定。系统的处理方法一般是:实数中的整数部分全部输出,小数部分输出6位。

#include<stdio.h>
void main()
{
float a,b;
a = 111111.111;
b = 222222.222;
printf("%f\n",a+b);
}

结果:
333333.328125
解释:

                                    小数点
111111.111 1 1011 0010 0000 0111 . 0001 11
222222.222 11 0110 0100 0000 1110 . 0011 1
相加之和 101 0001 0110 0001 0101 . 0101 01
两个float转为double,在相加

想输出%,需要用连续两个%表示。

#include<stdio.h>
void main()
{
double a,b;
a = 111111.111;
b = 222222.222;
printf("%f\n",a+b);
printf("%e",123.456);
}

结果:
333333.333333
1.234560e+002

#include<stdio.h>
void main()
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
scanf("%d ,%d ,%d",&d,&e,&f);
char g,h,i;
scanf("%c%c%c",&g,&h,&i);
printf("g=%c,h=%c,i=%c\n",g,h,i);
}

结果:

12      33      42
a=12,b=33,c=42
2,3,4
a=2,b=3,c=4
qw
g=
,h=q,i=w
  • “&a”中的“&”是地址运算符。
  • scanf输入的时候,两个数据之间可以用多个空格、回车、tab
  • scanf输入的时候,两个数据之间不能用逗号(,)
  • 如果在“格式控制字符串”中除了格式声明以外还有其他字符,则输入字符时在对应位置应输入与这些字符相同的字符。
  • 在用“%c”格式声明输入字符时,空格字符和转义字符都作为有效字符输入,注意enter
  • -