欢迎大家进群一起学习,qq群3:646052087
网盘资料:链接:https://pan.baidu.com/s/1odgbx4gxSKqBkispTBxthg
提取码:vi74
TURBOC3或者MinGW软件的人机界面不够友好,用惯了IDE编程的我,感觉实在是力不从心,我这里使用CodeBlocks进行编程,软件、安装及使用方法已更新至百度网盘。大家也可以使用VC6++进行C语言的学习。
C语言基本语法
C代码由一个或多个.c和.h文件组成
*.c :c源代码文件
*.h :c头文件
标准的C代码通常包含以下部分:
- 预处理器指令
- 函数
- 变量
- 语句&表达式
- 注释
今后会针对性的进行详细解读
C代码以“;”结束,分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实体的结束。
printf("Hello, World! \n");//正确
return 0;//正确
printf("Hello World!\n")//错误,代码未以;结尾
C语言中存在两种注释方式:“//”或者“/**/”。
// :表示单行注释,从//开始到该行结束为注释
/**/:表示多行注释,从/*开始,一直到*/结束,可以跨越多行进行代码说明
#include<stdio.h>//单行注释
/*多行注释
多行注释
多行注释*/
C 标识符是用来标识变量、函数,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。
C 标识符内不允许出现标点字符,比如 @、$ 和 %。C 是区分大小写的编程语言。
moer//正确
desk//正确
_duck//正确
12_temp//错误,以数字开头
$ed//错误,不允许包含特殊字符
ed,dj//错误,不允许包含标点符号
void//错误,标识符不能为关键字
关键字是C语言中的保留字,这些保留字不能作为常量名、变量名或其它标识符名称。
auto、break、case、char、const、continue、default、do、double、else、enum、extern、float、for、goto、if、int、long、register、return、short、signed、sizeof、static、struct、switch、typedef、union、unsigned、void、volatile、while、inline、restrict、_Bool、_Complex、_Imaginary、_Alignas、_Alignof、_Atomic、_Static_assert、_Noreturn、_Thread_local、_Generic
C 中的空格
只包含空格的行,被称为空白行,可能带有注释,C 编译器会完全忽略它。
在 C 中,空格用于描述空白符、制表符、换行符和注释。空格分隔语句的各个部分,让编译器能识别语句中的某个元素(比如 int)在哪里结束,下一个元素在哪里开始。因此,在下面的语句中:
int temp;
在这里,int 和 temp之间必须至少有一个空格字符(通常是一个空白符),这样编译器才能够区分它们。另一方面,在下面的语句中:
animal = dog + cat; // 获取动物的总数
animal 和 =,或者 = 和 dog 之间的空格字符不是必需的,但是为了增强可读性,您可以根据需要适当增加一些空格。
C语言二进制与十六进制
二进制、八进制、十六进制在计算机中常用的进制,大家对十进制应该非常了解,逢十进一。那什么是二进制、八进制、十六进制呢?同理,二进制就是逢二进一,八进制就是逢八进一、十六进制就是逢十六进一。这样说大家一头雾水,下面举个简单的例子让大家对这些进制有大概的图画感。
先从简答的说起,十进制就好比一个容器最多可以盛十个单位杯子的水,当水倒满后,自动将全部的水倒入到下一容器。而每高一位的容器是上一容器的十倍。上图:
十进制的个位有最多可以盛九杯水,再倒一杯水就会溢出,这时将新的水和原来的水一同倒入十位的容器中,以此类推。
二进制只有0和1两个计量单位,每位最多计一个数,当最低位再计一个数,溢出,产生进位。
那二进制数和十进制之间怎么转换?有公式,大家可以按照“按权相加法”,类似于十进制=个位10^0+十位*10^1+百位*10^2…。二进制也是按照该方法=第一位2^0+第二位*2^1+第三位*2^2…
十六进制和十进制之间的转换类似,我们熟知的是0-9数字表示十六进制的0-9,用A表示10,用B表示11,用C表示12,用D表示13,用E表示14,用F表示15,类似于十进制,十六进制转换为十进制=第一位*16^0+第二位*16^1+第三位*16^2…
关于这些进制的区别,大家可以通过程序反复实践来了解。
#include<stdio.h>
int main()
{
char erjinzhi=0b11;
char shijinzhi=11;
char shiliujinzhi=0x11;
printf("erjinzhi=%d\r\n",erjinzhi);
printf("shijinzhi=%d\r\n",shijinzhi);
printf("shiliujinzhi=%d\r\n",shiliujinzhi);
return 0;
}
代码中都为11,但是表示的却不一样,我们通过printf打印出变量的十进制,可以看到输出结果如下:
大家可以通过编程来了解二进制和十六进制。printf括号中的双引号引起来的是字符串,这个我们在Hello World!例程中已经知道,%d是占位符,代表该处存在一个十进制数,会在“,”后面添加相关变量,一个占位符需要对应一个变量或常量。“\r\n”表示回车,如果没有,所有输出结果都会在一行上。
数据类型
数据包括变量和常量,变量及可以改变的数,常量及不可改变的固定数。
常量大家应该很好理解,2,3,4,5,40这些数都是固定的数,是常量,在C语言中如何定义常量呢,通过#define宏定义的方式定义
#include<stdio.h>
#define PI 3.14 //表示将3.14赋值给PI,PI=3.14,不可改变
int main()
{
char dat;//dat表示变量,可以赋值改变
printf("常量PI为=%0.2f\r\n",PI);
dat=0;//赋值为0
printf("变量dat为=%d\r\n",dat);
dat=26;//赋值为25
printf("变量dat为=%d\r\n",dat);
}
我们代码中定义了PI,通过打印函数可以看到概数为我们定义的值3.14,如果我们在主函数中试图改变他(PI=0),程序将编译失败。大家可以将下列代码赋值到main函数中试一下,将会报错。
PI=0;//错误,常量不可赋值
还有一种字符常量,通常\我们单独在代码中是不能实现的,我们通过转义符来实现\,常见的字符常量如下
变量有很多种类型,不同类型所占字节长度和最大最小值不同,下表列出了整数型变量的存储大小和取值范围。
下表列出了关于标准浮点类型的存储大小、值范围和精度的细节:
void类型,及空类型。void 类型指定没有可用的值。它通常用于以下三种情况下:
变量定义在之前的程序中,大家已经完成了变量的定义int temp
就是变量的定义我们首先写出所定义的数据类型,紧接着空格后面写上我们的变量名称。
变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示:type variable_list;
在这里,type 必须是一个有效的 C 数据类型,可以是 char、w_char、int、float、double 或任何用户自定义的对象,variable_list 可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。下面列出几个有效的声明:
int i, j, k;
char c, ch;
float f, salary;
double d;
行 int i, j, k; 声明并定义了变量 i、j 和 k,这指示编译器创建类型为 int 的名为 i、j、k 的变量。
变量可以在声明的时候被初始化(指定一个初始值)。初始化器由一个等号,后跟一个常量表达式组成,如下所示:
type variable_name = value;
下面列举几个实例:
extern int d = 0, f = 5; // d 和 f 的声明与初始化
int d = -3, f = 7; // 定义并初始化 d 和 f
byte z = 24; // 定义并初始化 z
char x = 't'; // 变量 x 的值为 't'
不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0),其他所有变量的初始值是未定义的。
C 中的变量声明
变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
变量的声明有两种情况:
一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。
除非有extern关键字,否则都是变量的定义。
extern int j; //声明,不是定义
int j; //声明,也是定义
尝试下面的实例,其中,变量在头部就已经被声明,但是定义与初始化在主函数内:
#include <stdio.h>
// 函数外定义变量 x 和 y
int x;
int y;
int addtwonum()
{
// 函数内声明变量 x 和 y 为外部变量
extern int x;
extern int y;
// 给外部变量(全局变量)x 和 y 赋值
x = 1;
y = 2;
return x+y;
}
int main()
{
int result;
// 调用函数 addtwonum
result = addtwonum();
printf("result 为: %d",result);
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:result 为: 3
如果需要在一个源文件中引用另外一个源文件中定义的变量,我们只需在引用的文件中将变量加上 extern 关键字的声明即可。
多个文件如何在codeblocks完成编译运行,作者开始的时候建立了一堆文件发现不能够编译其它的.c,别的文件中的函数不能够被主函数调用,这主要是所有文件不在一个工程下,我们需要新建一个工程(新建Console application),如下,然后在工程中添加.c和.h文件,再次编译即可成功。
addMethod.c文件代码:
#include <stdio.h>
#include "addMethod.h"
int addM(int i,int j)
{
return i+j;
}
addMethod.h文件代码:
#ifndef ADDMETHOD_H_INCLUDED
#define ADDMETHOD_H_INCLUDED
int addM(int i,int j);
#endif // ADDMETHOD_H_INCLUDED
main.c 文件代码:
#include <stdio.h>
#include <stdlib.h>
#include "addMethod.h"
int main()
{
int i=2,j=4;
int result;
result=addM(i,j);
printf("The Result is %d\n",result);
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
C 中的左值(Lvalues)和右值(Rvalues)
C 中有两种类型的表达式:
左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。下面是一个有效的语句:
int g = 20;
但是下面这个就不是一个有效的语句,会生成编译时错误:
10 = 20;