1.main()函数

main()函数是一种特殊的函数,被称为“主函数”,任何一个程序都必须有且只有一个main()函数。main()函数的最后一句为return 0;,指结束main()函数函数,并向系统返回一个整数0。按照惯例,如果main()函数返回 0,说明程序运行正常返回其他数字则表示不同的异常情况。

2.常量,变量和数据类型

常量和变量都有数据类型
常量的数据类型通常由书写格式决定。
由于C语言为强类型语言,所以其每个变量都需要声明。且当声明数据类型后,可同时定义实参
格式
类型名 变量名;
例子
int celsius,fahr;
声明某个数据类型的变量将使得编译程序为该变量分配内存空间
在定义某个数据类型时,如果在结尾的分号前列出变量的名字,那么编译程序也将为这个变量分配内存空间。

基本数据类型:

其值不可以再分解为其它类型。

构造数据类型:

构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。一个构造类型的值可以分解成若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或又是一个构造类型。在C语言中,构造类型有以下几种:数组类型、结构体类型、共用体(联合)类型。

指针类型

指针的值用来表示某个变量在内存储器中的地址。虽然指针变量的取值类似于整型量,但这是两个类型完全不同的量。

空类型

调用函数值时,有一类函数调用后并不需要向调用者返回函数值,这种函数可以定义为“空类型”。其类型说明符为void。

#define 标识符 常量符号常量

用来定义符号常量。其中#define为宏定义命令的专用定义符。习惯上把符号常量名用大写字母表示。

整数与浮点类型

整数与浮点数类型大小

注:可以通过sizeof()函数来查看一个数据类型所占用的字节数。输出为整数
当所要表示的超过它所能存储的范围,编译器不会报错,但是会溢出

char型

C语言中char型只占一个字节
0 – 127 char 可以和整型互换使用。对应ASCII表(超出这个范围,无法正常显示字符)。
在内存中,字符数据是以ASCII码值(整数)存储的。这就使字符型数据整型数据之间可通用。字符型数据可以以字符型或整数形式输出。以字符形式输出时,需要先将存储单元中的ASCII码转换成相应字符,然后输出。
也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算。
注:每一个小写字母比它相应的大写字母的ASCII码大32(0——48,A——65,a——97)



字符常量是由一对单撇号括起来的单个字符
字符串常量是一对双撇号括起来的字符序列
C语言以字符‘\0’(ASCII码为0,空操作字符,不引起任何控制动作,不显示作为字符串结束标志。
如果有一个串常量”CHINA”,实际上在内存中是:

其占内存单元是6个字符,最后一个字符为’\0’。但在输出时不输出’\0’。
当运行printf("How do you do.”);,其从第一个字符开始逐个输出字符,直到遇到最后的’\0’停止输出。
:在写字符串时不必加’\0’。’\0’是系统自动加上的。
在C语言中没有专门的字符串变量,如果想将一个字符串存放在变量中以便保存,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每一个元素存放一个字符。

3.算数运算和赋值运算

赋值运算

C 语言提供了 11 个赋值运算符,均为二元运算符。即:

  • 基本赋值运算符:=。
  • 复合赋值运算符:+=(加赋值)、-=(减赋值)、*=(乘赋值)、/=(除赋值)、%=(求余赋值)、 <<=(左移赋值)、>>=(右移赋值)、&=(按位与赋值)、|=(按位或赋值)、*A=(按位异或赋值)。
注:赋值运算符优先级低于算数运算符。

赋值运算中的自动类型转换(隐式转换)

若赋值运算中左右数据类型不同,系统将自动进行类型转换,即把左值类型换为右值类型。具体如下:
  • 实型>>整型,舍去小数。
  • 整型>>实型,增加小数部分(小数部分的值为0)。
  • 字符型>>整型,将字符的ASCII码值放到整型量的低八位中,高八位为0。
  • 整型>>字符型,只把低八位赋予字符。

算术运算

算术运算符可分为一元和二元(一元优先级一般高于二元)。
  • 一元运算符:+(正号)、-(负号)、++(增1)、–(减1)
  • 二元运算符:+(求和)、-(求差)、*(求积)、/(求商)、%(求余)
  • 符号+(取正,可写可不写),-(取负)

自增量运算符:++(增1)、–(减1)

++n的运算顺序n=n+1,输出n
n++的运算顺序输出n,n=n+1
自增量运算符可以用于整数类型也可以用于浮点类型(例:n=3.10;n++;>>  n=4.100)
:增1、减1运算符不仅能改变表达式的值,也改变了变量自身的值。使用时要慎重,尤其以下两种情况:
  • 当一个变量多次出现在某表达式中时
  • 多参函数调用时,如果一个变量出现在多个实参中时,不要对该变量使用增 1 或减 1 运算符

左值(lvalue)和右值(rvalue)

可修改的存储对象,称为左值或 lvalue。
可赋值给左值的量,称为右值或 rvalue(右值可以是常量、变量或者表达式)。

相除运算符 /

当操作数均为整数取整
当操作数中有浮点数,包含整数部分和小数部分

取余运算符%

当操作数均为整数时,结果为取余。
运算符 % 无法用于浮点数

4.C语言格式输出

函数printf()

使用该函数需要调用<stdio.h>库
printf函数调用的一般形式为:
printf(“格式控制字符串”, 输出表列)

其中格式控制字符串用于指定输出格式,用%来代表各种数据。

格式控制字符串

格式字符串的一般形式为:
    %[标志][输出最小宽度][.精度][长度]类型([]中的项为可选项)
各项的意义介绍如下:
1) 类型
类型字符用以表示输出数据的类型。
格式字符
意义
d
十进制形式输出带符号整数(正数不输出符号)
o
八进制形式输出无符号整数(不输出前缀0)
x,X
十六进制形式输出无符号整数(不输出前缀Ox)
u
十进制形式输出无符号整数
f
小数形式输出单、双精度实数
e,E
指数形式输出单、双精度实数
g,G
自动识别以较短宽度输出单、双精度
c
输出单个字符
s
输出字符串
2) 标志
标志
意义
 –   
结果左对齐,右边填空格
 +
输出符号(正号或负号)
空格
输出值为正时冠以空格,为负时冠以负号
 #       
对c、s、d、u类无影响; 对o类,在输出时加前缀o; 对x类,在输出时加前缀0x; 对e、g、f 类当结果有小数时才给出小数点
3) 输出最小宽度
用十进制整数来表示输出的最少位数。
实际位数多于定义的宽度,则按实际位数输出
实际位数少于定义的宽度补以空格或0
4) 精度
精度格式符以“.”开头,后跟十进制整数
如果输出数字,则表示小数的位数
如果输出字符,则表示输出字符的个数
注:若实际位数大于所定义的精度数,则截去超过的部分。
5) 长度
长度格式符为h、l两种。
h表示按短整型量输出。
l表示按长整型量输出。
6)综合汇总表
%c
输出一个单一的字符
%hd、%d、%ld
以十进制、有符号的形式输出 short、int、long 类型的整数
%hu、%u、%lu
以十进制、无符号的形式输出 short、int、long 类型的整数
%ho、%o、%lo
以八进制、不带前缀、无符号的形式输出 short、int、long 类型的整数
%#ho、%#o、%#lo
以八进制、带前缀、无符号的形式输出 short、int、long 类型的整数
%hx、%x、%lx %hX、%X、%lX
以十六进制、不带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字也小写;如果 X 大写,那么输出的十六进制数字也大写。
%#hx、%#x、%#lx %#hX、%#X、%#lX
以十六进制、带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字和前缀都小写;如果 X 大写,那么输出的十六进制数字和前缀都大写。
%f、%lf
以十进制的形式输出 float、double 类型的小数
%e、%le %E、%lE
以指数的形式输出 float、double 类型的小数。如果 e 小写,那么输出结果中的 e 也小写;如果 E 大写,那么输出结果中的 E 也大写。
%g、%lg %G、%lG
以十进制和指数中较短的形式输出 float、double 类型的小数,并且小数部分的最后不会添加多余的 0。如果 g 小写,那么当以指数形式输出时 e 也小写;如果 G 大写,那么当以指数形式输出时 E 也大写。
%s
输出一个字符串
:使用printf函数时还要注意输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左。
:本质上讲,printf() 执行结束后数据并没有直接输出到显示器上,而是放入了缓冲区,直到遇见’\n’才将缓冲区中的数据输出到显示器上。

puts()函数和putchar()函数

puts()函数

使用该函数需要调用<stdio.h>库
puts() 函数可以将字符串直接输出到屏幕。
int puts(const char *s);
s可以是字符指针变量名字符数组名字符串常量
输出时只有遇到 ‘\0’ 才停止。

putchar()函数

使用该函数需要调用<stdio.h>库
putchar函数能够输出一个字符
putchar(ch);
ch可以是变量常量转义字符表达式
数据类型可以是字符型整型(输出对应ASCII码)。

5.关系运算符

C语言提供了以下关系运算符:
关系运算符
含  义
数学中的表示
<
小于
<
<=
小于或等于
>
大于
>
>=
大于或等于
==
等于
=
!=
不等于
关系运算符都是双目运算符,其结合性均为左结合
关系运算符优先级低于算术运算符高于赋值运算符
<、<=、>、>=的优先级相同,高于==和!=,==和!=的优先级相同。
注:==表示等于,=表示赋值

6.C语言格式输入

函数scanf()

使用该函数需要调用<stdio.h>库
scanf函数的一般形式为:
    scanf(“格式控制字符串”, 地址表列);
其中格式控制字符串的作用与printf函数相同。
如果在“”中输入非格式字符串,在控制器输入时也需输入同样的非格式字符串。
地址表列中给出各变量的地址(地址运算符“&”后跟变量名组成)。
这个地址就是编译系统在内存中给a、b变量分配的地址。

变量的地址和变量值的关系

在赋值表达式中给变量赋值(如a=123),a为变量名,123是变量的值,&a是变量a的地址。
但在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。

格式字符串

格式字符串的一般形式为:
    %[*][输入数据宽度][长度]类型
其中有方括号[]的项为任选项。各项的意义如下。
1) 类型
表示输入数据的类型,其格式符和意义如下表所示。
格式
字符意义
d
输入十进制整数
o
输入八进制整数
x
输入十六进制整数
u
输入无符号十进制整数
f或e
输入实型数(用小数形式或指数形式)
c
输入单个字符
s
输入字符串
2) “*”符
用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。如:
scanf(“%d %*d %d”,&a,&b);
当输入为:1   2   3时,把1赋予a,2被跳过,3赋予b。
3) 宽度
用十进制整数指定输入的宽度(即字符数)。例如:
scanf(“%5d”,&a);
输入12345678只把12345赋予变量a,其余部分被截去。又如:
scanf(“%4d%4d”,&a,&b);
输入12345678将把1234赋予a,而把5678赋予b。
4) 长度
长度格式符为l和h,l表示输入长整型数据(如%ld)和双精度浮点数(如%lf)。h表示输入短整型数据。
使用scanf函数还必须注意以下几点:
scanf函数中没有精度控制,如:scanf(“%5.2f”,&a);是非法的。不能企图用此语句输入小数为2位的实数。
scanf中要求给出变量地址,如给出变量名则会出错。如 scanf(“%d”,a);是非法的,应改为scnaf(“%d”,&a);才是合法的。
在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。

7.getchar()函数与gets()函数

 getchar(void)函数从屏幕读取下一个可用的字符,并把它返回为一个整数。这个函数在同一个时间内只会读取一个单一的字符。getchar()使用方法为:
int n=getchar();
gets()函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。gets() 函数不仅比 scanf 简洁,而且,就算输入的字符串中有空格也可以直接输入,不用像 scanf 那样要定义多个字符数组。最重要的是可以直接输入带空格的字符串
# include <stdio.h> 
int main(void) {
     char str[20] = "\0";  //字符数组初始化\0
     printf("请输入字符串:");
     gets(str);
     printf("%s\n", str);
     return 0;
 }
注意:使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。这就意味着,如果前面使用过 gets(),而后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了,因为缓冲区的回车已经被 gets() 取出来扔掉了。

8.常用数学函数<math.h>库

三角函数

double sin (double x); x的正弦值

double cos (double x); x的余弦值

double tan (double x); x的正切值

反三角函数

double asin (double x); 结果介于[-PI/2, PI/2],x值域为[-1,1]

double acos (double x); 结果介于[0, PI],x值域为[-1,1]

double atan (double x); 反正切(主值), 结果介于[-PI/2, PI/2]

double atan2 (double y, double x); 反正切(整圆值), 结果介于[-PI, PI]

双曲三角函数

double sinh (double x); x的双曲正弦值

double cosh (double x); x的双曲余弦值

double tanh (double x); x的双曲正切值

指数与对数

double exp (double x); 幂函数e^x

double pow (double x, double y); x^y,如果x=0且y<=0,或者x<0且y不是整型数,将产生定义域错误

double sqrt (double x); x的平方根,其中x>=0

double log (double x); 以e为底的对数,自然对数,x>0

double log10 (double x); 以10为底的对数,x>0

取整

double ceil (double x); 取上整

double floor (double x); 取下整

绝对值

double fabs (double x); x的绝对值

标准化浮点数

double frexp (double x, int *exp); 标准化浮点数, x = f * 2^exp, 已知x求f, exp ( x介于[0.5, 1] )并返回f值

double ldexp (double x, int exp); 与frexp相反, 已知x, exp求x*2^exp

取整与取余

double modf (double x, double *ip); 将参数的整数部分通过指针回传, 返回小数部分,整数部分保存在*ip中

double fmod (double x, double y); 返回两参数相除x/y的余数,符号与x相同。如果y为0,则结果与具体的额实现有关