c语言入门(1)

423 阅读8分钟

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

(未完待续)

--------------------------------------------------------------------------------------------

看完点个赞吧,给别人点赞,会让自己觉得自己是一个善良的人。

关注一下,让自己觉得自己是一个友善的人,开放包容的人,人生会不经意间美妙一点点。

我的收获期待与你分享,希望一同成长!