跳转至

基础语法

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.编译预处理指令

7e0397676ecfae6e6809bab10754a9f

e78ba7326593f479190595f246e3b96

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.递归

自己调用自己的函数,要有结束条件