首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

抽丝剥茧C语言(初阶 中)

注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。 举个例子 #include //下面代码,打印结果是什么?为什么?...这是函数的语法规定,你传进去的是整形的参数那么你就要用整形的参数来接收,你要声明一下我的这个x y是整形才能接收,至于x y这两个临时变量(因为生命周期仅仅在Add函数内有效)名字是你自己定义的,和变量一样...这是地方是函数的返回类型,我们这段代码要算加法,运行完之后我们要返回一个值,return就是返回的意思,后面空格加上你要返回的就可以了,不可只能返回一个值,一旦返回,return后面的代码将不会被执行,...这里返回的是z,z是我们在Add创建的临时变量,我们当然不是真的返回z,而是返回z里面的整形数据,也就是两数相加的和,因为返回的也是一个常量,所以并不会被销毁, 所以说,返回的是什么类型,函数名前面就要加上什么类型...转义字符虽然作用多,但是别忘记只要加了 \ 这个符号你可能就会少打印一个字母或者是数字,多打印了一些奇怪的东西. 注释要好好利用,不仅仅可以快速屏蔽代码,还可以让人更容易读懂你的代码!

69200

02.Django基础二之URL路由系统

而且注意如果你这个正则后面没有写$符号,即便是输入了月份路径,也会被它拦截下拉,因为它的正则也能匹配上 url(r'^articles/(?P[0-9]{4})/(?...,没所谓了,因为是按照名字来取数据的,还记得关键字参数吗?   ...获取一个URL 最开始想到的信息是处理它视图的标识(例如名字),查找正确的URL 的其它必要的信息有视图参数的类型(位置参数、关键字参数)和值。   ...在某些场景中,一个视图是通用的,所以在URL 和视图之间存在多对一的关系。对于这些情况,当反查URL 时,只有视图的名字还不够。...,不管你是访问app01下的index还是app02下的index,打印的结果都是/app02/index/,也就是打印的是最后一个index别名对应的url路径。

1.5K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    干货|手把手教你写单片机的结构体

    因为教育机构默认你是知道的,所以在讲流水灯时他们并不会讲解GPIO初始化这个结构体,因为默认你是知道如何操作的。 ?...满屏的变量... 2、结构体闪亮登场 然后搞C语言那帮家伙就造了个功能struct 1、结构体就是可以把变量包含到里面的东西 struct就代表要定义一个结构体,sensors是这个结构体的名字, 然后是一个大括号...当我们定义好结构体变量后,在初始化变量里面的成员变量时就会自动出现结构体里面的成员变量,如果这个代码是你一个一个敲出来的话,你就会感叹结构体在单片机中是那么的奇妙! ? ? ?...建议初学者把下面这张图保存到你的电脑,这样你就永远也不会忘记typedef在结构体中的用法了,也能很快的记住结构体这个东东。 ?...//打印p代表的地址里面的值(其实就是打印value的值) printf("value=%d\r\n",*(sen.p)); while(1) { } } 既然是指针变量,所以给指针变量赋值时当然是赋值的是一个地址

    81972

    C++初阶 入门

    在我们学习语言的过程中,你们是否想过,未来有一天,我参加了一个项目,项目里有算上你有3个程序员,你们要分模块化进行代码的编写从而实现一款2D像素小游戏,小A他负责装备特性和炫酷技能的编写,小B负责人物之间的交互...2.2使用命名空间 众所周知,C++是基于C进行升级的编程语言,因此在C上的各种代码依然是可以在C++上跑的。...如图所示,我们像写C的时候包两个头文件,再定义一个全局变量rand,之后使用printf函数队rand的值进行打印,但在 C上能跑的代码现在就出现了问题,"rand重定义,以前的定义是函数",也就是说,...printf("%d ", rand); } 哎,怎么回事啊,怎么是这个奇奇怪怪的东西呀,我不是要打印出10吗?...3.C++的输入输出 using namespace std讲完以后我们来讲一下C++的输入输出,cout 是console out 的缩写,意思是朝着控制台输出,而是流插入运算符,你可以把它看作将数据从右边往左边流入

    10210

    初识C语言·函数

    1 函数的概念可以参照数学中的y = kx + b,给一个x的值,让它计算y的值,同理,函数就是给一个执行指令,让它完成后续操作。...,那么函数的形式参数就是用来接受实际参数的地址或者是值的 由上上面的代码可以发现,形式参数和实际参数的名字是可以一样的,这是因为内存给它们的函数栈帧不同,即空间不同,名字一样无所谓啦。...那么 为什么a,b,c是形式参数呢?因为如果你不调用这个函数的话,这几个数实际是不存在的,没有向内存申请空间。不信?看看 你看,在还没执行到这一步的时候,a,b,c是没有申请空间的。...因为传的是地址,地址是指针,在64位环境下,指针的值是8,8 / 2 肯定就是4咯,那个警告其实就是说咱们用另一个值除指针的大小值。 那么我们该怎么在自定义函数里面求得数组的大小呢?...当然,实际的多文件运用中,函数的声明一般放在头文件,函数的实现一般放在源文件里面,最后引用一下自己创建的头文件就可以了。 比如你可以试一下能实现加减乘除的代码呢?在使用多个文件的情况下。

    6910

    只有170字节,最小的64位Hello World程序这样写成

    里面是什么内容? 为什么入口是 main 函数?可以写一个程序入口不是 main 吗? main 的 int 返回值有什么用?是谁在处理 main 的返回值? printf 是谁实现的?...如果不用 printf 可以做到在终端中打印字符吗? 上面这些问题其实涉及到程序的编译、链接和装载,日常工作中也许大家并不会在意。 现代 IDE 在方便我们开发的同时,也将很多底层的细节隐藏了起来。...接下来我们来玩一个游戏,目标是:在 CentOS7 64 位操作系统上,编写一个体积最小的打印 hello world 的可执行程序。 Executable 我们先来看「可执行程序」这个概念。...实际上,我们可以说它是真正的「可执行」程序(区别于后文的脚本),或者说「原生」程序。 因为它里面包含了可以直接用于 CPU 执行的机器代码,它的执行无需借助外部。...但是后来 Google 才发现,还有更短的,那就是 PHP PHP 中 打印 hello world 的代码就是 hello, world,对的,你没看错,连引号都不用。

    54020

    初识Linux · 进程(2)

    当然是不会的,因为cpu并没有从里面读取数据,当代码跑起来的时候,就存在了一个进程,难道进程是对应的,已经跑起来的程序吗?当然不是,这是不废话,进程 = PCB + 自己的代码和数据。...因为ps -xaj打开了进程,通过管道筛选,筛选也是一个进程,那么我们想要不看它,就可以: grep -v grep反向筛选出不含grep的即可: 当然了,直接ps -xaj就相当于windows里面的任务管理器...我们是可以在一个进程中创建多个进程的,用到的函数是fork(): 这里有个很有意思很有意思的点,会颠覆你的编程三观的,即这个返回值pid_t,类型本质上是unsigned int,这里就先留个伏笔。...直接看结果: 可以发现打印了两遍第二次的printf,我们可以这样理解,我是一个公司老板,我在没有招员工之前一直再做相同的事,找了员工之后,员工和我做相同的事,但是我之前做的所以工作员工还需要做吗?...不需要,所以第一行的printf是不会执行的,父进程原本的代码就是要执行printf的,所以会打印两次child process。

    8910

    数组和函数小实践·扫雷

    首先,写一个游戏之前,我们应该知道这个游戏的基本逻辑,简易版的扫雷的游戏逻辑是在一个规格是9*9的棋盘里面排除雷,雷的数量可以自己输入,位置是随机的,当点某一个位置时,如果有雷你就噶了,如果没有就会显示这个点位周围有多少个雷...所以需要一个菜单,最基本的框架,最好是能循环判断你是否离开游戏或者是继续游戏的。...循环的实现就是在while()里面,因为非0就是真,所以只要不输入0,就会循环输入。...像这样,为什么又多了一个头文件?因为函数那篇讲过,函数的声明最好放在头文件里面,尤其是多文件的情况下,那么ROW COL长宽有了,还有个ROWS怎么回事?你猜猜呢?...1 坐标的合法性可以使用if语句进行判断 2 因为排雷,排一次,计算是在雷数组里面计算,而打印出来的是展现数组,所以这次传参需要传两个数组 3 判断胜利条件,只需要多创建一个变量,当这个变量 = 长 *

    8710

    数组的概念和使用

    依次打印数组元素的地址: 从输出的结果我们分析,数组随着下标的增长,地址是由小到大变化的,并且我们发现每两个相邻的元素之间相差4(因为一个整型是4个字节)。...不过也能打印出来值。...打印,休眠,这个地方我们可以清理下屏幕,在我们电脑上有一个cmd的命令提示符,这个黑窗口下可以执行很多的命令。...你还是好奇,你想知道到底多少,我就让 你猜,你会怎么猜?你会1,2,3,4...这样猜吗?显然很慢;一般你都会猜中间数字,比如:150,然后看大了还是小了,这就是二分查找,也叫折半查找。...但使用left、right求平均值的时候,可能出现潜在的问题,因为一个整型的取值范围有它的最大值也有它的最小值,一个整型占四个字节的空间,一块有限大小的空间里面,放的数字的大小肯定有它的上限。

    9010

    第一个C语言程序(从Hello World开始)

    双斜杠后面的为 注释 ,一般来说,注释用于标注这段代码的用途或解释思路等。因为注释不会被当作代码进行编译,所以无论添加什么注释内容,都不会对代码的实际运行产生任何影响。 2. 什么是函数?...在编程语言里面,你可以把函数看做一个盒子,这个盒子有如下几个特性: 开始执行时,函数可以被输入一些值 执行过程中,函数可以做一些事情 执行完成后,函数可以返回一些值 以上边的示例代码为例进行解释: 主函数什么都没有输入...这一段代码被称之为add函数的函数定义。 4. 主函数是整个C语言程序的入口 add函数 能直接运行嘛?答案是不行的。 所有的C语言代码都有一个起始入口,而这个入口就是 主函数main 。...你可以把它看做一个空箱子,里面可以装任何其他的和它类型一致的值。 result 只是我们给它起的一个名字,当然,可以任意起名。比如叫he,叫xiangzi,都可以(ps:起名要有语义性)。...在C语言中,标识符的可以按照你的喜好自己随意命名,但是必须遵循以下规则: 标识符可以用小写字母、大写字母、数字和下划线来命名。但是,标识符的第一个字符必须是字母或下划线,而不是数字。

    61520

    这段关于安全点的JVM源码有点意思!

    这是CoderW的第 13 篇原创文章 上海外滩 | 摄影©阿强 从一个问题开始,熟知并发编程的你认为下面这段代码的执行结果是怎么样的?...你赞成吗?...我的猜想看起来没什么问题,但实际运行效果证明了我是错的,下面是运行动图: 从运行动图上可以看到,将代码跑起来之后,却发现实际执行结果是这样的: 1 秒之后,主线程并没有马上打印 num,而是等 t1...这段被 JVM 动了手脚的代码!》中已经说的很清楚了,这里不再重复阐述。 此文就源于我当时的一个疑问:JVM 让线程都进入安全点到底干了什么不为人知的事情? 发生了 GC? 难道是发生了 GC 吗?...VMThread 是 JVM 自身启动的一个内部线程,它主要用来协调其它线程达到安全点以及执行 VM 操作。 VM 操作这个概念全文已经多次提到了,那到底有哪些操作是 VM 操作呢?

    55020

    详解C语言中的分支语句(下)

    } a是不成立,可我们居然能屏幕上打印出“认真学习”。...意思是如果 flag 为假,那么 !flag 就为真。!flag 为真就执行if里面的语句。 所以上面的代码的意思是当 flag 为假时,就执行if语句中的代码。...不过,一件可怕的事情也随之发生,你会发现switch语句并没有退出,而是接着执行了case 1分支里面的语句,接着就打印了“余数为1”。后面的过程类似,就不再赘述了。...究其原因,你会发现就因为没在每个case语句执行完后加上个break,就酿成了这种错误。可想而知,break对于switch语句的重要性。...这个写法是固定的吗?其实不然。 在switch语句中case语句和default语句是没有顺序要求的,只要你的顺序和语法满足实际需求即可。

    9610

    打开C嘎嘎的大门:你好,C嘎嘎!(1)

    ,无非就是设置了一个全局变量,然后打印出变量的内容罢了,想必各位读者朋友也是这么想的,的确,这个代码是正确的,那么小编再给各位一段代码,让大家来判断这个代码是否是正确的: #include代码和上面那个·代码不就多了一个头文件吗,这俩不应该是一样的吗?...所以说上面那个代码使用起来是会报错的,下面给大家展示一下报错原因: 当然,如果rand在函数内部是不会报错的,因为在函数内部属于局部变脸,想要打印它的时候,编译器会首先在main函数内部查找,然后再往后上找...cout函数是我们在C嘎嘎常常用来执行输出,也就是打印操作的函数,它的printf更好的功能就是它不再需要%d,%f之类的占位符,它会自动识别变量的数据,这是小编认为优化比较好的功能,那么我们如何使用cout...对于部分编译器这个是可以的,不过小编不太推荐使用这个方法,因为有些编译器它是不在接受这个换行符了,那么这个时候我们就又用到了一个函数,那就是endl函数,这个函数是专门来换行的,它的作用是:在流插入输出时

    8310

    初识C语言·指针(1)

    生活中,门牌号是地址,计算机中,字节位置是地址,当然,在C语言里面,地址有一个全新的名字,叫指针。  可以这样理解:内存单元编号 = 地址 = 指针。...你看吧,在64位机器下,这就是a的地址,因为是0a 00 00 00 就是a的4个字节,因为VS是小端存储,所以0a在前面,a是16进制的10,明了的吧?我们这下就给a的内存看的明明白白的了。...不是有4个字节吗,怎么打印了一个地址,这是因为打印地址的时候只打印低地址。 不信?你试试呢~ 所以当我们知道了第一个字节的地址,要访问后面的地址,那不就顺腾摸瓜吗?...你看,*p = 20,就是修改了a的值,*是解引用操作符,这个* 和int* 里面的*可不是一样的嗷,这个*就是一个操作符,int*这是一个整体,代表一个类型。...肯定有人问了,为什么在打印*p的前面加一个打印666呢?因为当函数test的栈帧被释放之后,可能还没来得及利用,你马上调用,说不定是行得通的,但是不要以为写对了,是运气比较好而已。

    5810

    预处理详解

    如果它们中间有空格,那么这个符号表就会被看作stuff的部分 #include #define abc(x) x*x //定义一个宏,宏的名字为abc,参数为x,执行的操作是x*x...编译器不会那么智能,它只是做替换操作,比方说这串代码 #include #define abc(x) x*x //定义一个宏,宏的名字为abc,参数为x,执行的操作是x*x int main...x) int main() { test(5, 123); } 我们可以看到传递过去的123被当作字符串打印出来了,接下来笔者举一个能真正使用这项功能的例子。...宏是没法调试的,因为在编译过程中,计算机已经把程序中带有宏的内容都根据宏的规则替换为了相应的代码,也就是说,你去调试的话你是看不到具体的变化的,因为这个变化体现在编译过程3...._没被定义则定义__abc__,同时引用头文件stdio.h //如果我们在别的文件中也这样写,便只可能引用一次stdio.h //__abc__是笔者随便弄的一个名字 而如果你嫌麻烦,你可以用#pragma

    13810

    抽丝剥茧C语言(初阶 上)

    printf 是一个输出函数,它的括号是什么,以后会讲(暂时先记住这个格式就好)括号里面的双引号之内的是你要输出的信息。 最后一个 ; 是这段话结束的标志,就像中文里的句号一样。...= 的作用,这个是赋值,左边是你要赋值的对象,右边是你要赋值的那个值。 定义的过程中也是初始化,因为如果没有赋值,电脑就会分配随机值。...从这个可以发现,其实代码本身并没有问题,可以让局部变量和全部变量名字相同,并且局部变量优先。 变量的使用 变量是可以变化的值,让我们看下面的代码。...是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的而限定这个名字的可用性的代码范围就是这个名字的作用域。...("%d",a); return 0; } 来看这段代码,局部变量 a 在 main 函数内,因为程序会从上往下走,add()是个函数,只要记住会进入这个函数执行命令就可以了。

    30100

    干货|手把手教你写单片机的C语言结构体

    因为教育机构默认你是知道的,所以在讲流水灯时他们并不会讲解GPIO初始化这个结构体,因为默认你是知道如何操作的。 ?...满屏的变量... 2、结构体闪亮登场 然后搞C语言那帮家伙就造了个功能struct 1、结构体就是可以把变量包含到里面的东西 struct就代表要定义一个结构体,sensors是这个结构体的名字, 然后是一个大括号...当我们定义好结构体变量后,在初始化变量里面的成员变量时就会自动出现结构体里面的成员变量,如果这个代码是你一个一个敲出来的话,你就会感叹结构体在单片机中是那么的奇妙! ? ? ?...建议初学者把下面这张图保存到你的电脑,这样你就永远也不会忘记typedef在结构体中的用法了,也能很快的记住结构体这个东东。 ?...//打印p代表的地址里面的值(其实就是打印value的值) printf("value=%d\r\n",*(sen.p)); while(1) { } } 既然是指针变量,所以给指针变量赋值时当然是赋值的是一个地址

    1.6K62

    详细剖析 extern C

    之所以在C++的世界里存在这样一个怪物,是因为C++允许对一个名字给予不同的定义,只要在语义上没有二义性就好。...比如,在一个编译单元内部,不允许存在同名的函数,无论这个函数是否用static修饰;在一个可执行程序对应的所有目标文件里,不允许存在同名对象,无论它代表一个全局变量,还是一个函数。...但此时,如果你重新编译my_handle.c,C语言编译器将会报告“语法错误”,因为extern"C"是C++的语法,C语言编译器不认识它。...把 #include 指令放置在extern "C" { }里面的另外一个重大风险是,你可能会无意中改变一个函数声明的链接规范。...解决它的一个简单方案是,定义一个特定的头文件——比如clinkage.h,在其中增加这样的定义: 以下举例中c的函数声明和定义分别在cfun.h 和 cfun.c 中,函数打印字符串 “this is

    1.4K30

    抽丝剥茧C语言(初阶 下)

    剩下的我就不说名字了,因为大家都已经知道了。...如图,在test.c的源文件已经有main函数了,所以add.c的源文件就不用main函数了,因为它们是一个工程。 这里我们的编译器报错了,为什么呢?...因为你在add.c这个文件里声明了a但是test.c文件不知道,你需要去声明一下,利用关键字extern如图 这里就成功的打印出来了我们变量a 的值,你只需要声明它是什么类型,变量名称就可以了...链接在这里进制转换 我们来看,一个字节等于8个bit位,一个bit位里面只能储存一个数字,因为我们计算机储存的本质正负电信号,也就是二进制0 1 至于后面为什么是0x什么什么的,这是因为0x表示十六进制...看到了吗,取出来的只是首个字节的地址,因为能通过首个地址找到后面三个字节的地址。 常量可以储存到变量里面,那地址如何存储?这需要定义指针变量。

    26300
    领券