better late than never. 只要开始,虽晚不迟。
------------------------------------------------------------------------------------------
最近学习数据结构,发现需要一点c语言功底,所有临时抱佛脚,突击以下c语言基础。
1. 历史
1972年,C语言诞生于美国的贝尔实验室,由D.M.Ritchie(丹尼斯.离奇)和ken.Thompson(肯。汤姆逊)以B语言为基础发展而来
1973年,在它的主体设计完成后,Thompson和Ritchie用它完全重写了UNIX,且随着UNIX的发展,c语言也得到了不断的完善。
1977年,Dennis M.Ritchie发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》(编译器)
1989年,诞生了第一个完备的C标准(美国国家标准协会),简称“C89”,也就是“ANSIc”,截至2020年,最新的C语言标准为2017年发布的“C17”。
2. 优势
直接操作底层硬件(设备驱动、操作系统、手机系统、)
速度之王,代码速度最快(与汇编语言一样)
编程语言之母(C++、java)
全能王:系统软件,应用软件,游戏等无所不能
3. 程序与编程语言
程序 = 一系列对数据加工的指令
编程语言:表示数据和指令的规则
机器语言:用0和1表示数据和指令(开关两个状态)
汇编语言:机器语言的字符化表示,每个汇编指令对应一个机器语言指令。(可读性差 适用性差 一个机器一种语言)
高级语言:用类人类语言表示指令数据,通过编译器或者解释器转化为机器指令程序
C语言程序:由函数构成,函数就是一组语句。C语言总是执行叫做main的函数。
Printf函数:用于屏幕打印输出。
预处理器:对源代码中的预处理指令进行处理,得到新的源代码
4. 环境安装
编译器(gcc,cl)+文本编辑工具(subline,nodepad++,记事本)
集成开发环境(CodeBlock VisualStudio)
Online C Compiler
Gcc下载:www.mingw.org/
5. 程序结构
注释:对程序进行说明. /* */
预处理命令:以#开头,预处理器对其进行处理
语句:以分号结尾
函数:命名的一组语句(程序块)
条件编译指令 #if #else #elif #endif
转义字符:\n换行 \t制表符 \v垂直制表符 \’单引号字符
\\反斜杠字符 \?问号字符 \a响铃. %f格式符

6. 变量、类型、格式化输出
变量:保存数据的内存块的名字。
定义: 类型名 变量名 = 数据值
基本类型:int(整型) char(字符型) float(单精度浮点实数型)
double(双精度浮点实数型)
printf输出格式:%开头表示格式符,表示格式串后的输出项按照什么样的数据格式进行输出,有几个输出项,有几个输出项,格式串中就有几个格式符,常见的格式符有以下几种:
%c:表示对应输出项是字符char
%d:表示对应输出项是整数类型int
%f:表示对应输出项是单精度实数类型float
%lf:表示对应输出项是双精度实数类型double
%s:表示对应输出项是一个字符串,即一串字符
float radius = 12
float area = 3.14*2.5*radius
printf(“area = %f\n”, area)
宏定义:#define eg:#define PI 3.1415 则PI是3.1415的名字,预处理会将代码中的PI用3.1415替换。
sizeof():类型变量占据内存块大小。
Scanf() 输入数据到变量对应的内存块
7. 运算符
算术运算符:+ - * / % ++ -- (加 减 乘 除 取余 自增 自减)
比较运算符:< > <= >= != 比较结果是1或0
逻辑运算符: &&与(两真为真) ||或(一真为真) !非 比较结果是1或0
位运算符:二进制运算,&与 |或 ^异或 ~取反
赋值运算符:=
复合赋值运算符:+= *= /= %= &= |= ^= ~= 比较结果是1或0
#include<stdio.h>
#if 0
// 绘制形状飞行器
void f(){
printf(" *\n");
printf(" * *\n");
printf(" * *\n");
}
int main(int argc,char **argv)
{
f();
return 0;
}
#endif
#if 0
/*
宏定义:#define eg:#define PI 3.1415 则PI是3.1415的名字,预处理会将代码中的PI用3.1415替换。
*/
#define PI 3.1415
int main ()
{
float radius = 2.5;
printf("area = %f",PI*radius*radius);
}
#elif 0
int main ()
{
printf("hello else \n");
printf("hello \t \n");
printf("hello \a \n");
float radius = 12;
float area = 3.14*radius*radius;
printf("area=%f\n", area);
printf("半径是%3.1f的圆的面积是:%f\n", radius,area);
//%3.1f 占据三个宽度 小数点后一位
radius = 2.5;
area = 3.14*radius*radius;
printf("半径是%4.1f的圆的面积是:%f\n", radius,area);
// printf输出格式:%开头表示格式符,表示格式串后的输出项按照什么样的数据格式进行输出,
// 有几个输出项,有几个输出项,格式串中就有几个格式符,常见的格式符有以下几种:
// %c:表示对应输出项是字符char
// %d:表示对应输出项是整数类型int
// %f:表示对应输出项是单精度实数类型float
// %lf:表示对应输出项是双精度实数类型double
// %s:表示对应输出项是一个字符串,即一串字符
float f; char ch = 'char';
int a = 1; double dou = 3.1415922;
printf("f=%f,ch=%c,a=%d\n",f,ch,a);
printf("dou=%lf\n", dou);
printf("%s\n","hello world");
return 0;
}
/*
sizeof() 类型变量占据内存块大小,以字节为单位 一字节八位 */
#elif 0
int main ()
{
int a;
float b;
char c;
double d;
printf("sizeof(a)=%d\n",sizeof(a));
printf("sizeof(int)=%d\n",sizeof(int));
printf("sizeof(b)=%d\n",sizeof(b));
printf("sizeof(float)=%d\n",sizeof(float));
printf("sizeof(c)=%d\n",sizeof(c));
printf("sizeof(char)=%d\n",sizeof(char));
printf("sizeof(d)=%d\n",sizeof(d));
printf("sizeof(double)=%d\n",sizeof(double));
return 0;
}
#elif 0
#include<limits.h> /* for CHAR_MIN CHAR_MAX .etc */
#include<float.h> /* for FLT_DIG DLB_DIG .etc */
/*
limits.h 包含了各种类型值的最大值 最小值 或实数精度对的宏含义*/
int main ()
{ /* 符号 分配空间 最小 最大 */
printf("char %d bytes %d to %d \n",sizeof(char ), CHAR_MIN, CHAR_MAX );
printf("unsigned char %d bytes %d to %d \n",sizeof(unsigned char ), 0 , UCHAR_MAX );
printf("short %d bytes %hi to %hi \n",sizeof(short ), SHRT_MIN, SHRT_MAX );
printf("unsigned short %d bytes %hu to %hu \n",sizeof(unsigned short), 0 , USHRT_MAX );
printf("int %d bytes %i to %i \n",sizeof(int ), INT_MIN , INT_MAX );
printf("unsigned int %d bytes %u to %u \n",sizeof(unsigned int ), 0 , UINT_MAX );
printf("long %d bytes %li to %li \n",sizeof(long ), LONG_MIN, LONG_MAX );
printf("unsigned long %d bytes %lu to %lu \n",sizeof(unsigned long ), 0 , ULONG_MAX );
printf("float %d bytes %e to %e \n",sizeof(float ), FLT_MIN , FLT_MAX );
printf("double %d bytes %e to %e \n",sizeof(double ), DBL_MIN , DBL_MAX );
printf("precision of double %d digts \n", DBL_DIG );
printf("precision of float %d digts \n", FLT_DIG );
return 0
}
#elif 0
/* scanf 输入数据到变量对应的内存块 & 取地址*/
#define PI 3.1415
int main()
{
float radius;
int a,b;
scanf("%f",&radius);
printf("%f",radius);
scanf("%d,%d",&a,&b);
printf("%d,%d",a,b);
return 0;
}
#elif 0
/*运算符 demo 01 */
int main () {
int a = 10; int b = 3;
printf("a=%d,b=%d\n",a,b);
printf("a + b = %d\n",a+b);
printf("a - b = %d\n",a-b);
printf("a / b = %d\n",a/b);
printf("a x b = %d\n",a*b);
printf("a %% b = %d\n",a%b);
a++;
printf("a=%d\n",a);
a--; a--;
printf("a=%d\n",a);
}
#elif 0
#include<math.h>/*运算符 求一元二次方程的跟 02 */
int main ()
{
double a,b,c,delta,x1,x2;
scanf("%lf %lf %lf",&a,&b,&c);
delta=b*b-4*a*c;
x1=(-b + sqrt(delta))/(2*a);
x2=(-b - sqrt(delta))/(2*a);
printf("方程%lf x^2 + %lf x + %lf = 0 的跟为 %lf, %lf\n",a,b,c,x1,x2);
return 0;
}
#elif 0
/* 比较运算符 逻辑运算符*/
int main () {
/* 比较运算 */
int a = 2;int b = 0; int c = 5;
printf("a=%d,b=%d,c=%d\n",a,b,c);
printf("%d>%d:%d\n",a,b,a>b);
printf("%d<%d:%d\n",a,b,a<b);
printf("%d<=%d:%d\n",a,b,a<=b);
printf("%d>=%d:%d\n",a,b,a>=b);
printf("%d!=%d:%d\n",a,b,a!=b);
/* 逻辑运算 */
printf("a=%d,b=%d,c=%d\n",a,b,c);
printf("!a = %d \n",!a);
printf("!b = %d \n",!b);
printf("%d || %d : %d \n",a,b,a||b);
printf("%d && %d : %d \n",a,b,a&&b);
printf("%d || %d : %d \n",a,c,a||c);
printf("%d && %d : %d \n",a,c,a&&c);
printf("%d || %d : %d \n",b,c,b||c);
printf("%d && %d : %d \n",b,c,b&&c);
return 0;
}
#elif 0
#include<stdlib.h>
int main ()
{
/*位运算符 */
int a = 37; int b = 12;
char s[10]; /*10个char(字符)类型的数组 */
itoa(b,s,2);
printf("a=%d,二进制是:%10s\n",a,s);
itoa(b,s,2);
printf("b=%d,二进制是:%10s\n",b,s); /* 10s表示右对齐 -10s表示左对齐 */
itoa(a&b,s,2); /* & 按位与 同真为真 */
printf("a&b=%d,二进制是:%9s\n",a&b,s);
itoa(a|b,s,2); /* | 按位或 一真为真 */
printf("a|b=%d,二进制是:%9s\n",a|b,s);
itoa(a^b,s,2); /* ^ 按位异或 相同为0 不同为1 */
printf("a^b=%d,二进制是:%9s\n",a^b,s);
itoa(~a,s,2); /* ~ 按位取反 */
printf("~a=%d,二进制是:%9s\n",~a,s);
return 0;
}
#elif 1
int main ()
{ /*复合运算符 */
int a = 37; int b = 12;
printf("a=%d,b=%d,\n",a,b);
a+=b; /* a=a+b */
printf("a+=b:%d,\n",a);
a%=b; /* a=a%b */
printf("a%%=b:%d,\n",a);
}
#endif(未完待续)
--------------------------------------------------------------------------------------------
看完点个赞吧,给别人点赞,会让自己觉得自己是一个善良的人。
关注一下,让自己觉得自己是一个友善的人,开放包容的人,人生会不经意间美妙一点点。
我的收获期待与你分享,希望一同成长!