C语言介绍及分支语句

本文介绍了C语言的基本概念、发展历程,以及如何编写第一个C语言程序。讲解了预处理、编译、链接的过程,C语言的数据类型、变量与常量、运算符、分支语句,并提供了几个实例来练习。同时,文章还涉及到了C语言的文件类型、存储空间单位和数据分类。
摘要由CSDN通过智能技术生成

一、C语言简介
BCLP->new B->C语言->UNIX->Minix->Linux->gcc
C语言诞生于1970~1973年,在肯.汤普逊和丹尼斯.里奇的编写
下完成,归属于美国贝尔实验室。
C语言是专门用于编写操作系统而发明的编程语言,所有天生适合
对硬件编程,也以运行速度快而著称,也非常适合实现数据结构和算法
由于出现的时间过早,有很多缺陷,已存在着很多的陷阱,但是我们的
前辈给我们总结了一些避免陷阱的经验教训《C陷阱与缺陷》
C语言的语法很自由,但是也意味着危险,自由源于自律

C89语法标准,默认是gcc编译器的语法标准
C99语法标准,对C语言的拓展和增强,Ubuntu 16.04 默认C99
-std=gnu99 指定为C99语法标准
C11语法标准,全新的升级

二、第一个C语言程序
1、vim xxx.c 创建.c源文件
2、编写代码,并保存退出
3、gcc xxx.c 编译.c源文件,成功会得到a.out可执行文件
4、./a.out 运行可执行文件
注意:可以合并3、4
gcc xxx.c && ./a.out
#include <stdio.h>
程序员所编写的代码不是标准C代码,需要一段程序把它翻译程标准C代码
复制翻译的程序叫做预处理器,翻译的过程叫做预处理,需要被翻译的代码
叫做预处理指令,以#开头的代码叫做预处理指令
#include 功能是导入头文件
#include <xxx.h>
<> 从系统指定路径查找头文件并导入
#include “xxx.h”
“” 先从当前工作路径查找头文件,如果找不到再从系统指定路径
查找并导入
stdio.h
头文件:以.h结尾,里面存在的是辅助性代码,绝大多数都是
函数的说明

    int main()
    {
        printf("Hello World!\n");
        return 0;
    }
    
    main函数:function

        C语言以函数为单位管理代码,一个函数就是一段具有某一项
        功能的代码段
        main函数是程序的执行入口,必须有且只能有一个
        int 是一种数据类型,它表示main函数的执行结果是一个
        整数
        return 功能有两个:1、结束函数的执行
            2、返回一个结果给函数的调用者
        main函数的调用者是操作系统,它的返回值是给了操作系统的,
        它的值能反应出程序是如何结束的,一般有三类:
        正数  出现异常  (别人的错误)
        0    一切正常
        负数    出现错误   (自己的错误)

        printf/scanf 是标准库中的函数,主要负责输出数据、输入数据
            printf("想要输出的内容");
        转义字符:
            键盘上无法直接打印显示的符号,用一些特殊的字符组合来
            表达,这种特殊的字符组合称为转义字符,\n就是其中之一
            \r   回到行首
            \t  制表符,相当于Tab,用于输出格式对齐
            \b  退格键
            \a  铃响
            \\  表示一个\
            %%  表示一个%

C语言中以分号作为一行代码的结束,使用大括号划分区域

二、编译器
负责把人能看得懂的记录着代码的文件,翻译成计算机能看得懂的二进制
文件,由预处理器、编译器、链接器组成
gcc是由GNU社区为了编译Linux内核代码而开发的一款免费的编译器
gcc常用的编译参数;
-E 只显示预处理结果到终端
-std=gnu99 设置C99语法标准
-c 只编译不链接
-o 指定编译结果的名字 -oname -o name
-S 生成汇编代码
-I 指定头文件的加载路径 -I 加载路径
-Wall 尽可能多地产生警告
-Werror 把警告当错误处理
-l 指定要加载的代码库 -lm 使用数学库

三、C代码变成可执行文件的详细过程:
1、预处理 把源文件翻译成预处理文件
gcc -E code.c 显示预处理结果到终端
gcc -E code.c -o code.i 生成以.i结尾的预处理文件
2、编译 把预处理文件翻译成汇编文件
gcc -S code.i 生成以.s结尾的汇编文件
3、汇编 把汇编文件翻译成二进制的目标文件
gcc -c code.s 生成以.o结尾的目标文件
4、链接 把若干个目标文件合并成一个可执行文件
gcc a.o b.o c.o … 默认生成a.out可执行文件
四、C语言文件类型:
.c 源文件
.h 头文件
.h.gch 头文件的编译结果文件,它会被优先使用
.i 预处理文件
.s 汇编文件
.o 目标文件
.a 静态库文件
.so 共享库文件

五、存储空间的单位:
Bit 比特 一个二进制位,只能存储0或1,计算机中
存储数据的最小单位
Byte 字节 八个二进制位,计算机存储器描述存储容量的
基本单位
KB 1024字节
MB 1024KB
GB 1024MB
TB 1024GB
PB 1024TB

六、数据类型:
为什么要对数据进行分类?
1、现实生活中的数据本身就自带类别属性
2、对数据进行分类可以节约存储空间、提高运行速度

C语言中数据分类为两大类:自建(程序员自己设计的类型:结构、
联合、类)和内建(C语言自带的类型)
    注意:运算符sizeof 可以计算类型、变量的字节数
    整型:
        signed  有符号
            signed char     1   -128~127
            signed short    2   -32768~32767
            signed int  4   正负20亿
            signed long 4/8 
            signed long long    8   正负9开头19位
            整数

        unsigned    无符号
            unsigned char     1   0~255
            unsigned short    2   0~65535
            unsigned int  4   0~40亿
            unsigned long 4/8 
            unsigned long long    8   0~1开头的20位整数
        注意:signed不加就代表了加
            由于定义无符号整型时比较麻烦,C标准库把无符号类型
            重定义成一些新的简单的类型名:
                需要导入头文件<stdint.h>
                uint8_t uint16_t uint32_t uint64_t
                int8_t int16_t int32_t int64_t
    浮点型:    有小数部分的类型
        float   单精度   4
        double  双精度  8
        long double 12/16
        注意:小数点后六位有效
        注意:采用一定的算法对真实的浮点型数据到二进制数据进行
        转换,这个过程比存储、读取整型要慢得多,编程时尽量使用
        整型数据
    模拟型:
        字符型:char
            字符就是符号和图案,在内存中存储的依然是整数,需要
            显示出字符时,会根据ASCII表中对应的关系显示出对应
            的字符和图案
            '0' 48  
            'A' 65
            'a' 97
            '\0'    0   特殊字符    空字符
        布尔型:bool
            先有的C语言后有的bool类型,所以C语言中不可能有真正
            的布尔类型,在头文件stdbool.h中对布尔类型进行了模拟
                bool    true    false
                非0为真 0为假

七、变量与常量
什么是变量:程序运行期间数值可以发生变化的叫做变量,
相当于一个存储数据的盒子
定义: 类型名 变量名;
int num;
取名规则:
1、由字母、数字、下划线组成
2、不能以数字开头
3、不能与C语言32个关键字重名,能默写
4、见名知意 (功能、类型、作用范围…)
使用:
赋值: 变量名 = 10;
num = 10;
参与运算: 2+(变量名10);
2+(num
10);
注意:C语言中变量的初始值是随机的,为了安全起见,一般在
定义时初始化为0

变量的输出与输入:
    int printf(const char *format,...);
    功能:输出数据
    format:"双引号包含的提示信息+占位符"
    ...:变量名列表
    返回值:输出的字符个数

    类型占位符:C语言中通过类型占位符传递变量的类型
    signed  char  short int long long long
            %hhd  %hd    %d %ld %lld
    unsigned  %hhu  %hu    %u %lu %llu
    float   %f 
    double  %lf
    long    double  %LF 
    字符型 char %c
    定义各种类型的变量并初始化,使用printf显示它们各自的值

    int scanf(const char *format,...);
    功能:输入数据
    format:"双引号包含的占位符"
    ...:    变量地址列表
    返回值:成功输入的变量的个数
    注意:scanf需要提供变量的地址 &变量名 == 变量地址

什么是常量:程序运行期间数值不能改变的叫做常量
    100 默认int类型
    100l long
    100ll long long
    100u unsigned int
    100lu unsigned long 
    100llu unsigned long long
    3.14    默认double
    3.14f   float
    3.14l   long double

八、格式化输入输出
%nd 显示n个字符宽度,不够则补充空格,右对齐
%-nd 显示n个字符宽度,不够则补充空格,左对齐
%0nd 显示n个字符宽度,不够则补充0,右对齐
%n.mf 显示n个字符宽度(小数点也算一位),不够则补充空格
,m表示小数点后几位(四舍五入,不够补0),右对齐
%g 不显示小数点后多余的0

九、运算符
自变运算符:++/-- 使变量的值自动加1或者减1
前自变;++num/–num 立即生效
后自变:num++/num-- 下一行语句才有效
注意:不要在一行代码中多次使用自变运算符
算术运算符:+ - * / %
整数/整数 结果还是整数,没有小数点,只保留整数部分
10/3 -> 3
10%3 -> 1
/ % 除数不能为0,否则就会浮点数例外、(核心已转储),这是个运行报错
,一旦产生程序立即停止,后面不在执行
关系运算符: > < >= <= == !=
比较结果0(不成立)或1(成立),比较结果可以继续参与后续
的运算
int n = 100;
if(10 < n < 100)
结果永远为真,与数学运算规则不同
注意:== 建议常量放左边
逻辑运算符:&& || !
先把运算对象转换成逻辑值,0转换为假,非0转换为真
A && B 一假即假
A || B 一真即真
!A 求反
&& || 短路特性:
当左边部分的值可以确定整个表达式的结果时,右边部分
就不执行计算
三目运算符:运算对象有三个部分
A ? B :C 判断A的值如果为真则执行B,否则执行C

赋值运算符
    a = 10;
    a += 10;    a=a+10;
    a-=10;
    a*=10;
    a/=10;
    a%=10;
位运算符:&  | ~ ^ >>    <<

十、分支语句
if(表达式)//单分支
{
//表达式为真(非零),则执行此次代码
}

if(表达式)//双分支
{
    //表达式为真(非零),则执行此次代码
}
else
{
    //表达式为假(零),则执行此次代码
}

if(表达式1)//多分支
{
    //表达式1为真(非零),则执行此次代码
}
else if (表达式2)
{
    //表达式2为真(非零),则执行此次代码
}
else if(表达式3)
{
    //表达式3为真(非零),则执行此次代码
}
else
{
    //如果以上所有表达式都为假,则最后执行此处代码
}
1、输入三个整数,从小到大显示
include <stdio.h>

int main(int argc,const char* argv[])
{
int num1 = 0;
int num2 = 0;
int num3 = 0;
printf(“请输入三个整数:”);
scanf(“%d%d%d”,&num1,&num2,&num3);
if (num1>=num2)
{
int temp = 0;
temp=num2;
num2=num1;
num1=temp;
}
if (num2>=num3)
{
int temp = 0;
temp=num3;
num3=num2;
num2=temp;
}
printf(“将整数从小到大排列:”);
printf(“%d %d %d\n”,num1,num2,num3);
}

2、输入一个年份,判断是否是闰年
    四闰百不闰,四百闰
#include <stdio.h>

int main(int argc,const char* argv[])
{
int year = 0;
printf(“输入一个年份:”);
scanf(“%d”,&year);
if (year%4 == 0 && year%100!= 0)
{
printf(“年份为闰年”);
}
else if (year%400 ==0)
{
printf(“年份为闰年”);
}
else
{
printf(“年份不是闰年”);
}
}

3、输入一个年份和月份,判断该月有多少天
#include <stdio.h>

int main(int argc,const char* argv[])
{ int year=0,mon=0;
printf(“输入年份和月份:”);
scanf(“%d%d”,&year,&mon);
if(mon>=13||mon<=0)
{
printf(“输入错误\n”);
return 0;
}
if(mon1||mon3||mon5||mon7||mon8||mon10||mon12)
{
printf(“该月有31天\n”);
}
else if(mon
4||mon6||mon9||mon==11)
{
printf(“该月有30天\n”);
}

else if(year%400==0||(year%4==0&&year%100!=0))
{ 
     printf("29天\n");
}
else
{
    printf("28天\n");
}

}

4、输入一个成绩,判断等级
    [90,100]    A
    [80,89]     B
    [70,79]     C
    [60,69]     D 
    [0,59]      E
    other       成绩有误
#include <stdio.h>

int main(int argc,const char* argv[])
{
double num=0;
printf(“输入成绩:”);
scanf(“%lf”,&num);
if(num<=100 && num>=90)
{
printf(“A\n”);
}
else if(num<=89 && num>=80)
{
printf(“B\n”);
}
else if(num<=79 && num>=70)
{
printf(“C\n”);
}
else if(num<=69 && num>=60)
{
printf(“D\n”);
}
else if(num<=59 && num>=0)
{
printf(“E\n”);
}
else
printf(“成绩有误\n”);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值