基础语法
1.输出格式控制符
以%04d %4d %-4d %.2f %6.2f为例
%04d
含义:输出的数据为整形,4表示输出的数据宽度为4.
如果要输出的数据大于4位,直接输出数据。(下同)
如果要输出的数据宽度少于4位,就在数据左端补几个0,少几位就补几个0。
%4d与%-4d.
如果要输出的数据少于4位:
%4d在数据左端补空格,少几位就补几个空格。
%-4d在数据右端补空格,少几位就补几个空格。
%.4f与%6.2f
含义:f表示浮点数(小数)。
%.4f中的4表示小数点后数据为4位。(即保留4位小数)
%6.2f中6表示宽度为6(小数点也占一位,若有负号也占一位),其中小数点后占2位,小数点前占3位,如果不足3位,则在数据前面补空格,少几位就补几个空格。
小数点前多余三位则按原数据输出。
小数点后多余的小于五舍去,大于五进位;等于五看前一位是否为偶数,为偶数进位,为奇数舍去。
2.switch-case
基本结构:
switch (表达式)
{
case 常量表达式1: 语句1
case 常量表达式2: 语句2
┇
case 常量表达式n: 语句n
default: 语句n+1
}
注意点:
(1)switch 后面括号内的“表达式”必须是整数类型。也就是说可以是 int 型变量、char 型变量,也可以直接是整数或字符常量,哪怕是负数都可以。但绝对不可以float 型变量、double 型变量、小数常量通通不行,全部都是语法错误。
(2)每个case冒号后面可以跟多句但不加大括号,但最后必须有break,若没有break,会继续往下执行case
(3)default表示不在case所列的情况
(4)case只能做==的比较,不能><的比较
(5)case的排列顺序可任意
(6)case后面的值只能是常量
3.if-else
char gameover;
int player;
gameover = getchar();
scanf("%d", &player);
if ( gameover == 'N' )
if ( player == 1 ) printf("My turn");
else
printf("GAME OVER");
与python中不同,if else是不跟据缩进配对的,直接就近配对,所以本题输入“N2”,输出“GAME OVER”
4.do-while循环
至少做一次循环,在统计数字位数或分解整数可排除等于0的特殊情况
do
{
(循环体)
}while (条件); /*分号别忘*/
先做一次循环,再判断条件。
5.while循环
while (条件)
{
(循环体);
}
注意点:
(1)条件后不要加分号,否则会被认定为空语句,进入死循环
(2)while后面语句有多句一定要有大括号,否则只执行第一句
(3)while(i<n)的条件在循环体内i的值需要改变,不然会进入死循环
6.for循环
for (表达式1;表达式2;表达式3)
{
(循环体);
}
流程:先执行表达式1,再判断表达式2,若为True,则执行循环体,接着执行表达式3,然后继续循环,若表达式2值为假,则结束循环。
注意点:
(1)可省略表达式1或表达式3,但需保留分号
(2)若省略表达式2,则不判断循环条件,程序死循环
(3)表达式1和3还可以是逗号表达式
(4)若能保证程序正常结束循环,也可以省略表达式3
(5)3个表达式可以同时省略,程序死循环
(6)可同时省略表达式1和3,此时完全等同于while语句
(7)for循环后面语句有多句一定要有大括号,否则只执行第一句
若有break,break只能结束当前循环。
7.常用数学函数
头文件
#include <math.h>
平方根函数sqrt(x),x类型为double
绝对值函数fabs(x),x类型为double
绝对值函数abs(x),x类型为int,返回类型也为int
幂函数pow(x,n),x,n类型为double
指数函数exp(x),x类型为double
以e为底的对数函数log(x),x类型为double
8.自定义函数
定义
函数类型 函数名(参数类型 形式参数表) /*函数首部*/
{
函数体
}
函数类型是函数结果返回的类型,若无返回值,为void。
函数首部后面不能加分号,它和函数体一起构成完整的函数定义。
函数调用
任何C语言执行程序,都从主函数main()开始,遇到某个函数调用,主函数被停止执行转而执行相应的函数。
函数调用的格式:
函数名(实际参数表)
实参和形参一一对应,两者数量相同,类型尽量一致。
函数结果返回
return 表达式;
return结束函数运行,同时返回值,只能返回一个值。
函数原型声明
如果自定义函数被放在主调函数后面,就要在函数调用前加上函数原型声明。
函数类型 函数名(参数类型 参数表);
9.变量的存储类别
局部动态变量
C语言把定义在函数内部的变量称为局部变量,各函数之间内部的变量独立,不会相互干扰。不同函数之间可以存在同名变量,但函数内部之间也不会相互影响。具有以下特性:
(1)定义在函数体内或函数头中(即形参)
(2)定义时用auto这个词修饰局部动态变量,其中auto可以省略
(3)局部动态变量的作用域及生命期均为括住该变量定义语句的一对{}构成的代码块(即复合语句)。作用域是变量的有效范围,即可以引用该变量的区域。生命期是变量从诞生到死亡的周期
(4)局部动态变量在定义时没有赋值,则初始值是随机数
局部静态变量
static 类型名 变量表;
局部静态变量定义在函数体内。
定义局部静态变量的语句早在main()运行时就已经执行过,并且该变量也在那时诞生,因此每次局部静态变量被调用时,该变量的定义语句从不执行。当所在函数调用结束,静态局部变量不会死亡。
局部静态变量赋初值只在函数第一次调用时起作用,之后进入函数保持上次离开时的值。若没有赋初值,系统自动赋0。
函数返回一个变量的地址时,这个变量必须还没有死亡。
全局变量
C语言把定义在函数外而不属于任何函数的变量称为全局变量,全局变量的作用范围是从定义开始到程序所在文件的结束,它对作用范围内所有函数都起作用。全局变量一般定义在第一个函数的前面。
如果全局变量没有被初始化,会得到0值。指针会得到NULL值。必须用编译时刻已知的值(或CONST类型变量)来初始化全局变量。初始化要在main函数之前。
全局变量只能在某个模块定义一次,如果其他模块在引用(.h头文件)或程序上方的的语句引用下方的变量或函数造成的向前引用时,引用该全局变量,需要通过外部变量声明,否则编译错误。外部变量声明格式如下。声明不能初始化。声明不产生代码。同名结构不能重复声明
extern 类型名 变量表;
全局变量和局部变量允许同名,当函数局部变量和全局变量同名,在该函数中全局变量不起作用,局部变量起作用。对于其他不存在同名变量的函数,局部变量依然有效。当函数局部变量与复合语句的局部变量同名时,以复合语句为准。
全局静态变量
static 类型名 变量表;
定义在函数外部。全局静态变量的作用域仅局限于本文件内,不能跨文件,而全局变量是可以跨文件的。
10.编译预处理指令
define
可用#define定义宏,可定义常量,也可以带参数
如果一个宏的值中有其他宏的名字,也会被替换
如果一个宏的值超过一行,最后一行之前的行末需要加\
宏的值后面出现的注释不会被当作宏的值的一部分
具体运用时注意优先级,第三行中正确的运算顺序应为a+b*c
宏的用途:
1.定义符号常量
2.带参数的宏实现简单的函数功能
若避免优先级引起误解,应定义F(x,y) ((x)+(y)),结尾不能加分号
inculde
井号开头,表示编译预处理命令,行尾不需要分号
.h文件通常被称为头文件
头文件名 | 作用 |
---|---|
ctype.h | 字符处理 |
math.h | 与数学处理函数有关的说明和定义 |
stdio.h | 输入输出函数中使用的有关说明和定义 |
string.h | 字符串函数的有关说明和定义 |
stddef.h | 定义某些常用内容 |
stdlib.h | 杂项说明 |
time.h | 支持系统时间函数 |
if
#if 常量表达式
程序段
#endif
对常量表达式求值,如果结果非0,那么#if和#endif之间的程序段会被执行,否则不会处理。
#if指令后面也可以有#elif和#else指令
ifdef
#ifdef 标识符
程序段
#endif
如果标识符代表的宏已经被定义过了,执行程序段,否则不执行程序段
#ifndef的意义和#ifdef正好相反
#ifdef指令后面也可以有#elif和#else指令
11.main()的参数
当函数返回值为int,此int可省略
int main(int argc,char *argv[])
{
}
argc:argument count,参数个数
argv:argument variable,参数的内容
argv的类型为指针数组
一个C语言由多个文件模块组成,整个程序只允许有一个main()函数,程序允许从main()函数开始。包含main()函数的模块叫主模块。
12.typedef
typedef 可以用来定义新类型
typedef unsigned long int dword;
定义了一个新类型,可以代替unsigned long int
deword a; 相当于unsigned long int a;
typedef int tenint[10];
tenint a; //相当于 int a[10]
tenint a[2]; //相当于 int a[2][10]
理解的方法简单粗暴一点就是把typedef的新类型tenint名字划掉,再把新定义的变量a代进去
例:
这里的ap是新的类型名
13.malloc()与free()函数
malloc:内存分配
free:内存释放
//malloc()原型
void *malloc(int n);//其中参数n表示要分配的内存的字节数,该函数返回分配到的内存块的首地址
int n=100,i;
char *p;
p=malloc(n);
for (i=0;i<n;i++)
{
p[i]=i;
}
free(p);
14.递归
自己调用自己的函数,要有结束条件