手撕C语言理论知识(上)粗略讲解C语言的部分入门知识

news2024/12/27 13:48:47

目录

C语言的一些基础知识

操作符简介

Scanf的%[ ]

语句(分支、循环、goto)

函数



C语言的一些基础知识

  • 主函数 - 程序的入口 - main函数有且仅有一个。
  • char - short - int - long - long long - float - double
  • %d - 十进制整型   %u - 无符号整型
    %c - 字符  %s - 字符串
    %ld - long类型
    %p - 地址
    %f - float类型  %lf - double类型
    %e - 指数形式输出实数
    %o - 八进制  %x - 十六进制输出整数 / 字符串地址
    %g自动选择f和e格式且不输出无意义的0
  • “%-nd”,左对齐,m如果小于实际长度,则忽略
    “%n.xs" 输出n个字符,取字符串的前x位,左边补空格
    "%n.mf"总长度位n,小数点后有m位 在编译器上打印时,小数点后输出6个0
  • 数据类型
    char   字符数据类型1字节
    short  2字节
    int       4字节
    long    4字节/8字节,取决于平台( C标准规定sizeof(long) > sizeof(int) )
    long long   8字节
    float     单精度, 占4字节,32位,六位小数+小数点
    double 双精度,占8字节,64位,有效位数为16位,15小数+小数点
  • bit - 比特 - 最小单位                                                                                                          byte - 字节 - 1个字节是8个比特位,可以放8个二进制位                                                  1kb - 1024byte
  • float x = 9.6; 编译器会默认小数是double类型 -->  float x = 9.6f;
  • 局部变量的作用域(scope)是它所在的代码块,也就是它所在的{}内。                          (局部变量,是指在函数内部或复合语句内部定义的变量)                                              如果全局变量和局部变量同名,那么局部变量优先。全局变量的作用域是整个工程(另一处使用时只需extern声明一下就可以了)
  • 常量有:
    1、字面常量
    2、const修饰的常变量
    3、#define定义的标识符常量: #define Max 10
    4、枚举常量

字符串:由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容
“”是一个空字符串
字符数组——数组是一组相同类型的元素
char arr[]={ 'a','b','c' ,'\0'或0}

'\0' --> 转义字符 - 0 - ASCII是0        0 --> 数字0        '0' --> 字符0,ASCII是48

转义字符作用
\n换行
\r回车
\t水平制表符
\v垂直制表符
\dddddd表示1~3个八进制的数字
\xdddd表示2个十六进制数字
\?书写连续多个问号时使用,防止解析成三字母词(??+char)
\'字符常量'
\“表示一个字符串内部的双引号
\\表示一个反斜杠,防止它被解释为一个转义序列符
\a警告字符,蜂鸣
\b退格符
\f进纸符

16进制:数字0、1、2、3、4、5、6、7、8、9和字母A、B、C、D、E、F(a、b、c、d、e、f)
printf("%d",'\130'); // 输出8
printf("%d",'\x30');// 输出48

printf("%d\n", strlen("\628\test.c:\testc"));    //输出14
printf("%d\n", strlen("\\628\\test.c:\\testc")); //输出18

输出单个斜杠:
printf("%c",' ' ');//error,前面两个变成一对,后面落单
printf("%c",'\'');//正确


操作符简介

算术操作符:加减乘除模

移位操作符:左移<< 和 右移>>

位操作符:与&(相同才为1)、或|(有1就1)、异或^(相同则0)

赋值操作符:=    +=    -=    *=    /=    &=    ^=     |=      >>=     <<=

单目操作符:
!           逻辑反操作
-           负值
+           正值
&           取地址
sizeof        操作数的类型长度(以字节为单位)
~               对一个数的二进制按位取反
--               前置、后置--
++             前置、后置++
*                间接访问操作符(解引用操作符)
(类型)        强制类型转换

关系操作符:
>
>=
<
<=
!=   测试不相等
==      测试相等

逻辑操作符:与&&(遇到假就停止,后面表达式不执行),或||(遇到真就停止)

条件操作符: exp1?exp2:exp3

逗号表达式: exp1,exp2,...expn

下标引用:[]        函数调用:()        结构成员: . ->

sizeof计算 变量/类型 所占空间大小,单位字节。计算类型时必须加括号
int a = 10;        int arr[10]={0}; 
printf("%d\n",sizeof(int));//4
printf("%d\n",sizeof(a));//4
printf("%d\n",sizeof a);//4
printf("%d\n",sizeof int);//error

printf("%d\n",sizeof arr);//40

按位取反~
int a=0; int b=~a;
printf("%d",b);//输出-1
负数在内存中存储的时候,是二进制的补码。使用时,打印的是这个数的原码(原,反,补)


常见关键字: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

auto:现在一般都省略了,auto int a =10;
register:建议把某个变量放到寄存器内,是否存放进去由编译器决定。
signed:有符号数,signed int 和 int是等价的
typedef:类型重定义(typedef unsigned int u_int;        u_int a=5;)
static:
1、修饰局部变量 - 使局部变量的生命周期变长
2、修饰全局变量 - 改变全局变量的作用域 - 使静态的全局变量只能在自己所在源文件内部使用
3、修饰函数 - 改变了函数的链接属性,使其变成了内部链接属性(正常的函数有外部链接属性)


 #define定义标识符常量和宏:
#define MAX 100
#define  ADD(x,y)  (x+y)
宏定义中的宏名一般用全大写用于区分,宏定义不是C语言语句,不要加分号!

#define命令出现在程序中函数的外面(不能在函数内)作用域:定义命令到源文件结束。
#undef命令可以结束宏定义(#undef MAX)这不是语句,没有分号
宏定义只是预处理指令,只做字符的替换,而不分配内存空间

函数结果有无括号是有区别的。

如果字符串中含有宏名,不进行替换。


指针

指针变量的大小取决于地址的大小
32位平台下地址是32个bit位(即4个字节)
64位平台下地址是64个bit位(即8个字节)
int *pa = &a;指针的名字是p,类型是int*


结构体

结构体中字符串不能直接进行修改,而是使用strcpy函数

#include <stdio.h>
#include <string.h>
struct book
{
    char name[20];
    int price;
};
int main()
{
    struct book b={"C语言设计",20};
    b.price=10;
    strcpy(b.name,"C语言书籍");
    printf("%d\n",b.price);
    printf("%s",b.name);
}

Scanf的%[ ]

在输入字符时,scanf 遇到空格、回车等结束符都是会读取的。

除了加一个getchar()之外,另一个方法就是scanf的%[]


    scanf("%[^\n]", arr1);//回车之前的字符串都读取
	scanf("%[a-z]", arr2);//只读取a-z的字符,碰到非此字符及停止
    //例如:arr2输入abcd123,只读取abcd


语句(分支、循环、goto)

C语言中由一个分号隔开就是一条语句
1. 表达式语句
2. 函数调用语句
3. 控制语句
4. 复合语句
5. 空语句

 

九个控制语句:

1. 条件判断语句(分支语句):if、switch;
2. 循环执行语句:do while、while、for;
3. 转向语句:break、goto、continue、return

分支语句(选择结构)

if语句条件判断用“ == ”而不是 “ = ”。
建议把常量写在左边:if ( n==0 ) 写成 if ( 0==n )
switch用于多分支情况,case后面必须跟整型,且中间有空格。
switch-case-break-default,实际上default可以随便放哪,只是一般放在最后。
continue语句是不可以在单独的switch语句中使用,但可以在一个循环内的switch语句中使用

 循环语句for、while、do while

while ( (ch=getchar()) != EOF) 输入EOF,则ch=E,windows系统下,结束循环需要按下Ctrl+z
EOF的宏定义是#define EOF -1

由于ASCII码值的范围是0~255,所以,可以用EOF作为文件(这里一定要求是文本文件)结束标志,或是作为输入结束标志。

在C语言里,NULL代表的是值为0的void型指针,称为空地址,但NULL也有地址,它的作用是用来防止出现野指针的。 可以将NULL作为空指针常量使用,也可以写成 int*p=0;

for(初始化,判断,调整),for循环内的continue是跳到调整部分;for循环中如果判断部分省略,则判断部分恒为真。

别忘了do-while之后的分号 “ ; ”

 计算前n项的n阶和(忘记重置)

#include <stdio.h>
int main()
{
    int n =0;
    scanf("%d",&n);
    int sum=1;
    int s=0;
    for(int j=1;j<n+1;j++)
    {
        sum=1;//每次循环之后要记得重置(易错点)
        for(int i=1;i<j+1;i++)
        {
            sum*=i;
        }
        s+=sum;
    }
    printf("%d",s);
}

 二分查找

void binary_search(int x,int*arr,int sz)
{
    int left=0;
    int right=sz-1;
    while(left<=right)
    {
        int mid = (left+right)/2;
        if(arr[mid]>x)
        {
            right=mid-1;
        }
        else if(arr[mid]<x)
        {
            left=mid+1;
        }else 
        {
            printf("找到了,下标是%d",mid);
            break;
        }
    }
    if(left>right) printf("找不到");
}

Rand&Srand

rand()函数每次调用前都会查询是否调用过srand(seed),如果有,会自动调srand(seed)来初始化它的起始值;如果没有,系统会自动给seed赋初始值,即srand(1)自动调用它一次。一旦种子相同,每次的随机数也就相同,所以用到时间戳给srand。

时间戳:当前时间 - 计算机起始时间(1970.1.1.0:00)换算成秒
srand(time(NULL))
代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()

{
srand((unsigned int)time(0));
int i = 0;
for(;i < 5;++i)
   {
        int num = rand() % 100 + 1;
        printf("%d ",num);
    }
printf("\n");
}

srand函数在工程里只要调用一次就行了,不要把它放到自定义函数里多次调用。

goto语句

goto语句和标记跳转的标号是可以随意滥用的,但是除非是不得已的情况,不然不建议使用。goto语句最常见的用法是一次性跳出多层循环。

#include <stdio.h>

#include <string.h>

#include <windows.h>

int main()

{

    char input[15]={0};

    system("shutdown -s -t 60");

    again:

    printf("电脑将在60后关机,输入我是笨蛋就取消关机:>\n");

    scanf("%s",input);

    if(0==strcmp(input,"我是笨蛋"))

        system("shutdown -a");

    else

        goto again;

}//可以用while循环替代这一整段代码


 函数

常用库函数:IO函数、字符串操作函数、内存操作函数、时间函数、数学函数、其他

函数参数:
实际参数(实参):真实传给函数的参数。可以是常量、变量、表达式、函数等。无论实参是什么类型,它都必须有确定的值,以便于把值传给形参。
形式参数(形参):函数名后面括号里的变量,之所以叫形参是因为只有在函数被调用的过程中才实例化(分配内存),因此,形参只有在函数中才有效。
在交换函数中,可以理解为形参只是实参的一份临时拷贝,改变形参不会改变实参。

函数调用:
传值调用:函数的形参和实参分别占不同内存块,修改形参不改变实参。
传址调用:把函数外部创建变量的内存地址传给函数参数。这种传参方式可以让函数和函数外的变量建立起真正的联系。

注意:不能在函数内部计算数组元素个数,因为传过去的数组名是指针变量。
在函数中的sizeof(arr)/sizeof(arr[0])始终为1

嵌套调用与链式访问:
嵌套是指在应该函数中调用另一个函数;链式是指把一个函数的返回值作为另一个函数的参数。

printf("%d",printf("%d",printf("%d",43)));
输出4321
printf("%d",printf("%d",printf("%s","ab")));
输出ab21
printf的返回值是打印的字符个数

函数的声明与定义:
函数声明一般出现在函数使用之前,先声明后使用;函数声明一般放在头文件.h中。
函数定义是指函数的具体实现、函数功能实现 

函数递归
栈溢出(stac overflow):栈区空间一般是局部变量、函数形参等;堆区空间动态内存开辟;静态区一般是全局变量、static。当函数不停地调用自己的时候,会不停在栈区占用空间,最终导致栈溢出。
递归需要存在限制条件,当条件成立时递归结束;同时每次递归调用之后都要不停接近这个条件。递归的优缺点:结构清晰,代码简洁;但是可能会导致栈溢出、产生很多重复计算导致效率低、不停地调用函数需要消耗时间和空间导致效率低。

正序打印一个整型数字的每一位、不创建临时变量求字符串长度、求n!、计算第n个斐波那契数、汉诺塔、青蛙跳台阶....
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【博学谷学习记录超强总结,用心分享|产品经理基础总结和感悟15】

互联网产品设计背后的心理学02&#xff1a;你就是会被其他人的行为所影响一、前言二、实验设计及结果分析三、实验原理四、实验方法总结五、产品设计中的应用六、结束语前文回顾&#xff1a;让人们做出决定并不是信息本身&#xff0c;而是这些信息呈现的背景或情景。我们这个信…

Spring Cloud Alibaba Dubbo(服务远程调用)

一、软件环境 &#xff08;1&#xff09;自己部署服务器 所有软件及服务器自己进行管理提供&#xff0c;可以直接在项目中添加Spring Cloud依赖。推荐 <dependencyManagement> <dependencies> <dependency> <groupId>com.a…

liunx centos9中安装flask并在pycharm中使用图文攻略

liunx centos9中安装flask并在pycharm中使用图文攻略1.首先在liunx的终端中输入2.安装好flask之后就在pycharm创建新的项目处添加flask项目3.点击绿色三角箭头开始运行flask项目4. 然后登录ip地址就出现Hllo world就代表flask环境搭建完成需要注意事项1.首先在liunx的终端中输入…

ngx_thread_pool_init()

ngx_thread_pool_cycle()函数的主要工作是从待处理的任务队列中获取一个任务&#xff0c;然后调用任务对象的handler()函数处理任务&#xff0c;完成后把任务放置到完成队列中&#xff0c;并通过ngx_notify()通知主线程 手写线程池与性能分析 - 知乎 pthread_cond_wait函数的原…

【5G RRC】5G系统消息介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

一键绕过ID锁激活,为什么很多人都会失败?绕ID这一篇就够了

最近阳了所以暂时断更&#xff0c;你们也要注意身体&#xff0c;最好不要阳 现在绕ID的方法已经非常完善&#xff0c;一个小白选手只要有设备就可以正常绕过ID&#xff0c;总的来说绕ID分为两个步骤&#xff1a;第一步是手机的越狱&#xff0c;这里只能是用checkra1n越狱&…

数据在内存中存储☞(超详解)

目录 一.数据类型大家族 1.了解类型的意义 2.数据类型大家族的分类 二.详解☞数据储存之整形 1.储存方式 &#xff08;1&#xff09;.原码反码补码的概念 &#xff08;2&#xff09;.原码反码补码出现的原因&#xff1a; 计算机中只有加法器没有减法器&#xff0c;所有只…

SemanticKITTI: A Dataset for Semantic Scene Understanding of LiDAR Sequences

Paper name SemanticKITTI: A Dataset for Semantic Scene Understanding of LiDAR Sequences Paper Reading Note URL: https://arxiv.org/pdf/1904.01416.pdf TL;DR 2019 ICCV 论文&#xff0c;提出了一个大规模的真实场景 LiDAR 点云标注数据集 SemanticKITTI&#xff…

数字信号处理第六次试验:数字信号处理在双音多频拨号系统中的应用

数字信号处理第六次试验&#xff1a;数字信号处理在双音多频拨号系统中的应用前言一、实验目的二、实验原理和方法1.关于双音多频拨号系统2.电话中的双音多频&#xff08;DTMF&#xff09;信号的产生与检测3.检测DTMF信号的DFT参数选择4.DTMF信号的产生与识别仿真实验三、实验内…

菜鼠的保研总结

1.个人基本情况 本科学校&#xff1a;山东某双非 本科专业&#xff1a;网络工程 成绩排名&#xff1a;1/46 英语成绩&#xff1a;四级529&#xff0c;六级502 科研竞赛&#xff1a;美国大学生数学建模比赛特等奖提名、全国英语翻译比赛三等奖、山东省蓝桥杯java大学生B组三等奖…

C++基础:KMP

让我们先看一个问题&#xff1a;给定一个字符串 S&#xff0c;以及一个模式串 P&#xff0c;所有字符串中只包含大小写英文字母以及阿拉伯数字。模式串 P 在字符串 S 中多次作为子串出现。求出模式串 P 在字符串 S 中所有出现的位置的起始下标。输入格式第一行输入整数 N&#…

【Python】杨辉三角中的排成一列编号的问题

题目描述 下面的图形是著名的杨辉三角形&#xff1a; 如果我们按从上到下、从左到右的顺序把所有数排成一列&#xff0c;可以得到如下数列&#xff1a; 1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,⋯ 给定一个正整数 N&#xff0c;请你输出数列中第一次出现 N是在第几个数&#xff1f; …

Go语言设计与实现 -- 内存管理器

不同的编程语言选择不同的方式管理内存&#xff0c;本节会介绍Go语言内存分配器。 Go内存分配的设计思想是&#xff1a; 内存分配算法采用Google的TCMalloc算法&#xff0c;每个线程都会自行维护一个独立的内存池&#xff0c;进行内存分配时优先从该内存池中分配&#xff0c;…

第十八章Vue的学习

文章目录什么是VueVue.js的官网介绍环境配置基本语法声明式渲染绑定元素属性双向数据绑定条件渲染列表渲染事件驱动侦听属性Vue对象生命周期什么是Vue 对于Java程序来说&#xff0c;我们使用框架就是导入那些封装了**『固定解决方案』的jar包&#xff0c;然后通过『配置文件』…

CSS3 之选择器

文章目录1、关系性选择器&#xff1a;EFE~F2、属性选择器3、伪元素选择器4、伪类选择器(被选中的元素的一个种状态)calc1、关系性选择器&#xff1a;EFE~F 2、属性选择器 E[attr~“val”]E[attr|“val”]E[attr^“val”]E[attr$“val”]E[attr*“val”]3、伪元素选择器 E::pl…

CesiumLab对BIM模型的输入格式要求 CesiumaLab系列教程

BIM 模型和手工模型最大的区别在于几点&#xff1a; 1.建模目标不同&#xff0c;手工模型的目的是为了可视化&#xff0c;就是为了看的见&#xff0c;看不见的东西能省则省。BIM 完全是按照一些工程标准去创建的&#xff0c;比如路面可能有多个层代表了不同的物理层。手工模型…

windows编译Paraview源码

目录一. 环境准备二. 编译1. CMake2. Visual Studio一. 环境准备 下载基本所需&#xff1a; paraview官方给了编译文档&#xff1a;https://github.com/Kitware/ParaView/blob/master/Documentation/dev/build.md 所需要的基础有&#xff1a; 如图&#xff1a;&#xff08;进入…

2022我的年度总结-- AI遮天之路

我是一个普普通通的大学生&#xff0c;我的博客记录了我学习编程以来共计1年多的水平&#xff0c;我希望能把自己大学的经历、选择、困惑等与同样身处大学&#xff0c;选择AI方向不知如何发展的人进行分享&#xff0c;因此写了这篇年终总结。另外&#xff0c;对于一些刚刚开始写…

重磅!华为更新职业认证架构刷新和重认证规则

尊敬的各位朋友&#xff0c;感谢您一直以来对华为认证的支持&#xff01; 为匹配华为公司未来长期战略&#xff0c;紧随ICT技术演进趋势&#xff0c;自2023年1月1日起&#xff0c;华为职业认证将启用全新的架构体系和重认证规则&#xff0c;请您关注。 华为职业认证架构刷新 …

新年新希望--爱摸鱼的美工(12)

年近了&#xff0c;上班途中依然匆忙 看女孩子们渐渐开始倒腾 做了新发型&#xff0c;做了美美的指甲 换上了新衣服&#xff0c;买了新包 电话里讨论着 去哪里过年&#xff0c;买什么年货 好像以前的我也这样 今年挣得少了&#xff0c;不想添新衣&#xff08;不能&#xff09; …