当前位置: 首页 > news >正文

轻淘客的轻网站怎么做/交易平台官网

轻淘客的轻网站怎么做,交易平台官网,手机和电脑同步的进销存软件,旅游网站开发毕业设计1. Block语法 Block语法完整形式如下: ^void (int event) {printf("buttonId:%d event%d\n", i, event); }完整形式的Block语法与一般的C语言函数定义相比,仅有两点不同。 没有函数名。带有“^”(插入记号)。 因为O…

1. Block语法

Block语法完整形式如下:

^void (int event) {printf("buttonId:%d event=%d\n", i, event);
}

完整形式的Block语法与一般的C语言函数定义相比,仅有两点不同。

  1. 没有函数名。
  2. 带有“^”(插入记号)。

因为OS X、iOS应用程序会大量使用Block,所以插入“^”记号方便查找。

以下为Block语法的BN范式。

Block_literal_Expression ::= ^block_decl Compound_statement_body
block_decl ::=
block_decl ::= parameter_list
block_decl ::= type_expression

即便此前不了解BN范式,通过说明也能有个概念。

^ 返回值类型 参数列表 表达式

省略返回值类型

^ 参数列表 表达式

省略返回值类型时,Block语法将按照return语句的类型返回。如果表达式中有多个return语句,所以return语句的类型必须一致。

省略参数列表

^ 返回值类型 表达式

如果不使用参数,可省略。

省略返回值和参数列表

^ 表达式

2. Block类型变量

在定义C语言函数时,就可以将所定义的函数的地址赋给函数指针类型变量中。

int func(int count)
{return count + 1;
}
int (*funcptr)(int) = &func;

同样的,在Block语法下,可将Block语法赋值给声明为Block类型的变量中。即源代码中一旦使用Block语法就相当于生成了可赋值给Block类型变量的“值”。在有关Block语法的文档中,“Block”即指源代码中的Block语法也指由Block语法所生成的值。

声明Block变量的示例:

int (^bik)(int);

该Block类型变量与一般C语言函数变量完全相同,可作为以下用于使用。

  • 自动变量
  • 函数参数
  • 静态变量
  • 静态全局变量
  • 全局变量

使用Block语法,将Block赋值为Block变量。

int (^blk)(int) = ^(int count){return count + 1};

有“^”开始的Block语法生成的Block被赋值给变量blk中。因为与通常的变量相同,所以当然也可以有Block类型变量赋值给Block类型变量。

int (^bilk1)(int) = blk;
int (^blk2)(int);blk2 = blk1;

在函数参数中使用Block类型变量可以向函数传递Block。

void func(int (^blk)(int))
{...
}

在返回值类型中指定Block类型,可以将Block作为函数的返回值。

int (^func())(int) 
{return ^(int count){return count + 1};
}

但是在参数和函数返回值中使用Block类型变量极为复杂。这时,我们可以使用typedef来解决该问题。

typedef int (^blk_t)(int);

如上所示,通过使用typedef可声明“blk_t”类型变量。

void func(blk_t blk)
{...
}blk_t func()
{return ^(int count){return count + 1};
}

另外,将赋值给Block的类型变量中的Block方法像C语言通常的函数调用那样使用,这种方法与使用函数指针类型变量调用函数的方法几乎完全相同。
变量funcptr为函数指针类型时,像下面这样调用函数指针类型变量:

int result = (*funcptr)(10);

变量blk为Block类型的情况下,这样调用Block类型变量:

int result = blk(10);

通过Block类型变量调用Block与C语言通常的函数调用没有区别。在函数参数中使用Block类型变量并在函数中执行Block的例子如下:

int func(blk_t elk, int rate) {return blk(rate);
}

在Objective-C方法中:

- (int) methodUsingBlock:(blk_t) rate:(int)rate
{return blk(rase);
}

Block类型变量可完全像通常的C语言变量一样使用,因此也可以使用指向Block类型变量的指针,即Block的指针类型变量。

typedef int (^blk_t)(int);blk_t blk = ^(int count){return count + 1};blk_t *blkptr = &blk;(*blkptr)(10);

3. 截获自动变量

通过Block语法和Block类型变量的说明,我们已经理解了“带有自动变量值的匿名函数”中的匿名函数。而带有自动变量是什么呢?“带有自动变量值”在Block中表现为“截取自动变量值”。截取自动变量值的实例如下:

int main()
{int day = 256;int val = 10;const char *fmt = "val = %d\n";void (^blk)(void) = ^(printf(fat, val));val = 2;fmt = "These values were changed. val = %d\n";blk();return 0;
}

该源代码中,Block语法的表达式使用的是它之前声明的自动变量fmt和val。Blocks中,Block表达式截获所使用的自动变量的值,即保存该自动变量的值,即保存该自动变量的瞬间值。因为Block表达式保存了自动变量的值,所以在执行Block语法后,即便改写Block中使用的自动变量的值也不会影响Block执行时自动变量的值。该源代码就在Block改写后改写了Block中自动变量val和fmt。
执行结果:

val = 10

这就是自动变量的截获。

4. __block 说明符

实际上,自动变量值截获只能保存执行Block语法瞬间的值。保存后就不能改写该值。若想在Block语法的表达式中将值赋给Block语法外声明的自动变量,需要在该自动变量上附加__block说明符。我们称这种变量为__block变量。

__block int val = 0;void (^blk)(void) = ^{val = 1};blk();printf("val = %d\n", val);

该代码执行结果:

val = 1

5. 截获的自动变量

截获Objective-C对象,调用变更该对象的方法不会产生编译错误。

id array = [[NSMutableArray alloc] init];void (^blk)(void) = ^{id obj == [[NSObject alloc] init];[array addObject:obj];
};

这是没有问题的,而向截获的变量array赋值则会产生编译错误。该源代码中截获的变量值为NSMutableArray类对象用的结构体指针。

这种情况下需要给截获的自动变量附加__block说明符。

__block id array = [[NSMutableArray alloc] init];void (^blk)(void) = ^{array = [[NSMutableArray alloc] init];
};

另外,在使用C语言数组时必须小心使用其指针。只是使用C语言的字符串字面量数组,而并没有向截获的自动变量赋值,因此看似没有任何问题。但实际上会产生编译错误。

const char text[] = "hello";void (^blk)(void) = ^{printf("%c\n", text[2]);
};
error: cannot refer to declaration with an array type inside blockprintf("%c\n", text[2]);
note: delared hereconst char text[] = "hello";^

这是因为在现在的Block中,截获的自动变量的方法并没有实现对C语言数组的截获。这时,使用指针可以解决该问题。

const char *text = "hello";
void (^blk)(void) = ^{printf("%c\n", text[2]);
};

相关文章:

【OC】Blocks模式

1. Block语法 Block语法完整形式如下: ^void (int event) {printf("buttonId:%d event%d\n", i, event); }完整形式的Block语法与一般的C语言函数定义相比,仅有两点不同。 没有函数名。带有“^”(插入记号)。 因为O…...

软件设计师教程(七)计算机系统知识-操作系统知识

软件设计师教程 软件设计师教程(一)计算机系统知识-计算机系统基础知识 软件设计师教程(二)计算机系统知识-计算机体系结构 软件设计师教程(三)计算机系统知识-计算机体系结构 软件设计师教程(…...

蓝桥杯2023/3/2

1. 小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最…...

【IoT】创业成功不可或缺的两个因素:能力和趋势

今天就来谈谈能力和趋势究竟哪个更重要的问题。 在谈成功的十大要素时,我曾经讲到: 一命、二运、三风水,这三个要素几乎不涉及任何个人的努力。 而趋势跟这三个要素又是息息相关的,这也类似雷军所说的飞猪理论。 只要风足够大&…...

2020蓝桥杯真题日期格式 C语言/C++

问题描述 小蓝要处理非常多的数据, 其中有一些数据是日期。 在小蓝处理的日期中有两种常用的形式: 英文形式和数字形式。 英文形式采用每个月的英文的前三个宁母作为月份标识, 后面跟两位数字 表示日期, 月份标识第一个字母大写, 后两个字母小写, 日期小于 10 时要补 前导 0s…...

总时差与自由时差

定义总时差(总浮动时间)(TF,Total Free Time,不耽误项目总进度)LS(Latest Start)-ES(Earliest Start)LF(Latest Finish)-EF&#xff0…...

LeetCode两个数组的交集-跳跃游戏- 最长有效括号

两个数组的交集 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出:[2] 示例 2: 输入&…...

mysql普通索引与唯一索引怎么选择

学习mysql普通索引与唯一索引选择记录总结,学习链接:http://gk.link/a/11YG8从mysql查询操作分析:普通索引:查到满足条件的第一条记录后,还会继续查找下一条记录,直到出现满足条件的记录出现后停止检索唯一…...

JavaWeb开发(三)3.5——Java的反射机制

一、反射机制的概念 指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法。这种动态获取信息,及动态调用对象方法的功能叫java语言的反射机制。 Java反射机制的核心是在程序运行时动…...

Python每日一练(20230305)

目录 1. 正则表达式匹配 ★★★ 2. 寻找旋转排序数组中的最小值 II ★★★ 3. 删除排序链表中的重复元素 II ★★ 1. 正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个…...

SpringBoot三种方法实现定时发送邮件的案例

前言 小编我将用CSDN记录软件开发之路上所学的心得与知识,有兴趣的小伙伴可以关注一下!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,让我们共…...

opengl、opengl es、webgl介绍与opengl开发入门

1、OpenGL OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。OpenGL的高效实现(利用了图形加速硬件)存在于Windo…...

Vue3之组件间传值

何为组件间传值 在Vue3之组件文章中,我们学会了定义使用组件,但是我们似乎还缺少什么将组件之间联系起来,说到组件之间的联系就不得不提组件间的传值,而组件间的传值其实也不难理解,就是如何在子组件中接收到父组件传…...

Windows10下使用CMake编译ITK5.2.1步骤

编译环境:Windows10VS2017Cmak3.24.0ITK5.2.1 编译步骤: 1、下载ITK到本地:ITK官网Download | ITK,ITK5.2.1下载地址 https://github.com/InsightSoftwareConsortium/ITK/releases/download/v5.2.1/InsightToolkit-5.2.1.zip ​…...

字符串模式匹配,经典KMP算法你还不会?我可不允许你不会!

文章目录重点1. 简单模式匹配算法2. 部分匹配值PM的算法(Move j-1 PM[j-1])3. 部分匹配值PM的两次改进(Move j-next[j])4. 快速得到next数组5. KMP匹配算法重点 童鞋们看网上讲解的时候一定要分清楚序列是从0开始还是从1开始&…...

C++操作redis(实现连接池、分布式锁)

文章目录Redis连接池编译项目整体架构使用分布式锁总结Redis连接池 封装hiredis的一些基本操作,redishelper类提供包含连接,放回,存取键,push,pop,执行redis语句和执行lua脚本的函数,连接池是类…...

硬件基础专题-01电阻篇

目录 课程链接 学习目的 电阻 电阻理论讲解 电阻定义​ 欧姆定律​ 电阻单位换算 电阻选型考虑 安装方式 常见电阻值 各种贴片电阻的读取方式 确定电阻值的方法 电阻数据手册 电阻测量 电阻的产品应用​ 零欧姆电阻 热敏电阻 光敏电阻 课程链接 视频专辑 - 硬件…...

【JAVA程序设计】(C00112)基于Springboot+Thymeleaf的在线购物商城——有文档

基于SpringbootThymeleaf的在线购物商城——有文档项目简介项目获取开发环境项目技术运行截图运行视频项目简介 基于Springbootthymeleaf框架的在线购物商城系统,本系统共分为二个角色:管理员和用户 管理员角色包含以下功能: 商品管理、商品…...

shell基础(5)算数计算:运算语法、自增自减

文章目录1. shell算数运算的特点2. 运算符一览3. 运算语法3.1 整形运算3.2. 小数运算 ing4. 自增自减4.1. a与a4.2. 自加1. shell算数运算的特点 Shell 和其它编程语言不同,Shell 不能直接进行算数运算,必须使用数学计算命令。Shell只支持整数运算&#…...

virtio设备input节点

注册virtio_input_node节点,节点类型为VLIB_NODE_TYPE_INPUT。 VLIB_REGISTER_NODE (virtio_input_node) {.name "virtio-input",.sibling_of "device-input",.format_trace format_virtio_input_trace,.flags VLIB_NODE_FLAG_TRACE_SUPP…...

《计算机网络:自顶向下方法》学习笔记——第一章:计算机网络和因特网

计网 第一章 计算机网络和因特网 1.1 什么是因特网 回答这个问题有两种方式 其一,我们能够描述因特网的具体构成,即构成因特网的基本硬件和软件组件;其二,我们能够根据为分布式应用提供服务的联网基础设施来描述因特网。 1.1.…...

PDF 解析格式化输出 API 数据接口

PDF 解析格式化输出 API 数据接口 支持输出 TEXT HTML XML TAG,多种格式输出,超精准识别率。 1. 产品功能 通用的识别接口, 支持标准 PDF 文件解析;多种格式输出,支持 TEXT HTML XML TAG;HTML 包含完美排…...

RL笔记:基于策略迭代求CliffWaking-v0最优解(python实现)

目录 1. 概要 2. 实现 3. 运行结果 1. 概要 CliffWalking-v0是gym库中的一个例子[1],是从Sutton-RLbook-2020的Example6.6改编而来。不过本文不是关于gym中的CliffWalking-v0如何玩的,而是关于基于策略迭代求该问题最优解的实现例。 CliffWalking-v0的…...

350. 两个数组的交集 II

两个数组的交集 II 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结…...

Android仿微信选择图片

效果展示首先先添加用到的权限<uses-permission android:name"android.permission.INTERNET" /><!--获取手机存储卡权限--><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:nam…...

python+嵌入式——串口通信篇(收发解包)

目录前言安装pyserialpyserial大致概括整体流程硬件连接例子(简单版)详细使用serial初始化参数发包收包收包检查包并解包python struct模块结语前言 这几年&#xff0c;自己也做了一些嵌入式机器人。在整个开发的过程中&#xff0c;调通信通常会花费一段比较长的时间&#xff…...

剖析G1 垃圾回收器

简单回顾 在Java当中&#xff0c;程序员在编写代码的时候只需要创建对象&#xff0c;从来不需要考虑将对象进行释放&#xff0c;这是因为Java中对象的垃圾回收全部由JVM替你完成了(所有的岁月静好都不过是有人替你负重前行)。 而JVM的垃圾回收由垃圾回收器来负责&#xff0c;在…...

如何打造一款专属于自己的高逼格电脑桌面

作为一名电脑重度使用者&#xff0c;你是否拥有一款属于你自己的高逼格电脑桌面呢&#xff1f;你是不是也像大多数同学一样&#xff0c;会把所有的内容全部都堆积到电脑桌面&#xff0c;不仅找东西困难&#xff0c;由于桌面内容太多还会导致C盘空间不足&#xff0c;影响电脑的反…...

【C++】string的使用及其模拟实现

文章目录1. STL的介绍1.1 STL的六大组件1.2 STL的版本1.3 STL的缺陷2. string的使用2.1 为什么要学习string类&#xff1f;2.2 常见构造2.3 Iterator迭代器2.4 Capacity2.5 Modifiers2.6 String operations3. string的模拟实现3.1 构造函数3.2 拷贝构造函数3.3 赋值运算符重载和…...

怀念在青鸟的日子

时间过的可真快&#xff0c;一转眼来到了2023年&#xff01;我初中上完就没有在念&#xff0c;下了学门步入社会&#xff0c;那时的我一片迷茫&#xff0c;不知道该去干什 么&#xff0c;父母说要不去学挖掘机、理发、修车...我思考再三&#xff0c;一个都没有我喜欢的&#xf…...