结构体类型

第十章-1-结构体练习

折月煮酒 提交于 2020-02-08 13:23:44
/* * @Issue: 利用结构体类型编写程序,实现输入一个学生的数学期中和期末成绩,计算并输出平均值 * @Author: 一届书生 * @LastEditTime : 2020-02-08 12:19:13 */ #include<iostream> using namespace std; struct study{ int mid,end,average; }math; int main(){ while(cin>>math.mid>>math.end){ math.average=math.mid+math.end>>1; cout<<math.average<<endl; } return 0; }    /* * @Issue: 利用sort编写程序,实现输入3个学生的学号、数学期中和期末成绩,然后计算平均成绩 * 并输出成绩表 * @Author: 一届书生 * @LastEditTime : 2020-02-08 12:41:14 */ #include<iostream> #include<algorithm> #include<string> using namespace std; struct s { string id; int mid,end,average; }student[3]; bool cmp(s a,s b){ return a

《go语言从入门到进阶实战》_徐波

痞子三分冷 提交于 2020-02-08 02:02:57
摘录 Go语言是Google公司开发的一种静态型、编译型并自带垃圾回收和并发的编程语言。 Go语言不使用虚拟机,只有运行时(runtime)提供垃圾回收和goroutine调度等。 Go语言使用自己的链接器,不依赖任何系统提供的编译器、链接器。因此编译出的可执行文件可以直接运行在几乎所有的操作系统和环境中。 从Go 1.5版本之后,Go语言实现自举,实现了使用Go语言编写Go语言编译器及所有工具链的功能。 Go语言可以利用自己的特性实现并发编译,并发编译的最小元素是包。从Go 1.9版本开始,最小并发编译元素缩小到函数,整体编译速度提高了20%。 Go语言的并发是基于goroutine,goroutine类似于线程,但并非线程。可以将goroutine理解为一种虚拟线程。Go语言运行时会参与调度goroutine,并将goroutine合理地分配到每个CPU中,最大限度地使用CPU性能。 在Go语言中,自增操作符不再是一个操作符,而是一个语句。因此,在Go语言中自增只有一种写法: i++ 如果写成前置自增“++i”,或者赋值后自增“a=i++”都将导致编译错误。 在多个短变量声明和赋值中,至少有一个新声明的变量出现在左值中,即便其他变量名可能是重复声明的,编译器也不会报错。 布尔型无法参与数值运算,也无法与其他类型进行转换。 切片发生越界时,运行时会报出宕机,并打出堆栈

如何控制Go编码Json数据时的行为

你说的曾经没有我的故事 提交于 2020-02-08 01:09:52
一、自定义Json键名 首先在Go 程序中要将数据编码成JSON 格式时通常我们会先定义结构体类型,将数据存放到结构体变量中。 type Address struct { Type string City string Country string } type CreditCard struct { FirstName string LastName string Addresses []*Address Remark string } home := &Address{"private", "Aartselaar", "Belgium"} office := &Address{"work", "Boom", "Belgium"} card := VCard{"Jan", "Kersschot", []*Address{home, office}, "none"} js, err := json.Marshal(card) fmt.Printf("JSON format: %s", js) 只有导出的结构体成员才会被编码,这也就是我们为什么选择用大写字母开头的字段名称。在编码时,默认使用结构体字段的名字作为JSON对象中的key,但是一般JSON 是给HTTP接口返回数据使用的,在接口的规范里针对数据我们一般都要求返回snake case风格的字段名

双重嵌套结构体嵌套的调用

妖精的绣舞 提交于 2020-02-07 07:55:02
具体如下: typedef struct Student { char name [ 10 ] ; } Stu ; typedef struct Qlist { Stu p_1 ; //情况一 Stu * p_2 ; //情况二 } Qlist ; void print ( Stu * ps ) { printf ( "%s\n" , ps -> name ) ; } int main ( ) { Qlist * s = ( Qlist * ) malloc ( sizeof ( Qlist ) ) ; //需要创建一个Qlist结构体类型的空间 s -> p_2 = ( Stu * ) malloc ( sizeof ( Stu ) ) ; //如果 情况一 则不写, 情况二需创建一个Stu结构体类型的空间 scanf ( "%s" , & s -> p_1 . name ) ; print ( "%s\n" , & s - p1 . name ) ; // 一 scanf ( "%s" , & s -> p_2 -> name ) ; printf ( "%s\n" , & s -> p2 -> name ) ; // 二 return 0 ; } 来源: CSDN 作者: 丶独醒 链接: https://blog.csdn.net/m1059247324/article

c/c++日期时间处理与字符串string转换

£可爱£侵袭症+ 提交于 2020-02-07 04:19:48
在c/c++实际问题的编程中,我们经常会用到日期与时间的格式,在算法运行中,通常将时间转化为int来进行计算,而处理输入输出的时候,日期时间的格式却是五花八门,以各种标点空格相连或者不加标点。 首先,在c中,是有一个标准的日期时间结构体的,在标准库wchar.h内,我们可以看到结构体tm的声明如下: 1 #ifndef _TM_DEFINED 2 struct tm { 3 int tm_sec; /* seconds after the minute - [0,59] */ 4 int tm_min; /* minutes after the hour - [0,59] */ 5 int tm_hour; /* hours since midnight - [0,23] */ 6 int tm_mday; /* day of the month - [1,31] */ 7 int tm_mon; /* months since January - [0,11] */ 8 int tm_year; /* years since 1900 */ 9 int tm_wday; /* days since Sunday - [0,6] */ 10 int tm_yday; /* days since January 1 - [0,365] */ 11 int tm_isdst; /*

内核第一宏:offsetof宏和container_of宏

你离开我真会死。 提交于 2020-02-06 02:42:00
绪论 通过结构体的整体变量来访问其中的各个元素,形式上是通过 . / -> 来访问,实质上是通过指针方式来访问的(编译器会自动计算偏移量)。在 C/C++ 中,其实可以用一些宏来计算结构体中成员变量与结构体的地址关系,那就是 offsetof宏 和 container_of宏 一、offsetof宏 offsetof 宏:通过虚拟一个 type 类型的结构体变量,然后用 type.member 的方式来访问 member 这个成员变量,继而得到 member 相对于整个变量首地址的偏移量 1.1 offsetof 宏的实现 在C标准库中有对 offsetof 的声明,需包含头文件 stddef.h : size_t offsetof ( type , member ) ; 在 Linux 内核中的实现原理如下: # define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) TYPE 是结构体类型, MEMBER 是结构体中一个成员变量名 宏返回的是 MEMBER 相对于整个结构体变量的首地址的偏移量,类型是 unsigned int(即size_t) 1.2 解析 &((TYPE *)0)->MEMBER 注意:优先级 -> 高于 & (TYPE *)0 是一个强制类型转化,将数字 0 强制类型转换成 TYPE *

Block 实现 浅析

偶尔善良 提交于 2020-02-05 23:34:52
前言 这里 有关于 block 的 5 道测试题,建议你阅读本文之前先做一下测试。 先介绍一下什么是闭包。在 wikipedia 上, 闭包的定义 ) 是: In programming languages, a closure is a function or reference to a function together with a referencing environment—a table storing a reference to each of the non-local variables (also called free variables or upvalues) of that function. 翻译过来,闭包是一个函数(或指向函数的指针),再加上该函数执行的外部的上下文变量(有时候也称作自由变量)。 block 实际上就是 Objective-C 语言对于闭包的实现。 block 配合上 dispatch_queue,可以方便地实现简单的多线程编程和异步编程,关于这个,我之前写过一篇文章介绍: 《使用 GCD》 。 本文主要介绍 Objective-C 语言的 block 在编译器中的实现方式。主要包括: block 的内部实现数据结构介绍 block 的三种类型及其相关的内存管理方式 block 如何通过 capture

iOS Block详细介绍(block实现)

老子叫甜甜 提交于 2020-02-05 23:20:31
Block的实现 数据结构定义 block的数据结构定义如下图 对应的结构体定义如下: struct Block_descriptor { unsigned long int reserved; unsigned long int size; void (*copy)(void *dst, void *src); void (*dispose)(void *); }; struct Block_layout { void *isa; int flags; int reserved; void (*invoke)(void *, ...); struct Block_descriptor *descriptor; /* Imported variables. */ }; 通过改图 我们可以知道 一个block实例实际上由6部分组成。 1.isa指针。所有对象都有该指针,用于实现对象相关的功能。 2.flags 用于按bit位表示一些block的附加信息。本文后面介绍 block copy 的实现代码可以看到对该变量的使用。 3.reserved 保留变量 4.invoke 函数指针 指向具体的block实现的函数调用地址 5.descriptor 表示该block的附加描述信息 主要是size 大小 以及 copy 和 dispose函数的指针 6.variables capture

block基本使用和底层

爱⌒轻易说出口 提交于 2020-02-05 23:19:07
block基础使用语法 一、block与函数的对比 定义函数指针 int (*myFn)(); 定义Blocks int (^MyBlocks)(int,int); 调用函数指针 (*myFn)(10, 20); l调用Blocks MyBlocks(10, 20) 二、Block 语法: 1.作为当地变量: returnType (^blockName)(parameterTypes) = ^returnType(parameters) { ... ... } 2.作为属性: @property (nonatomic,copy) returnType (^blockName)(parameterTypes) 3.作为方法参数: -(void)someMethodThatTakesABlock:( returnType (^)(parameterTypes) )blockName 4.作为方法调用的参数: [someObject someMethodThatTakesABlock:^returnType(parameters){ ... ... } ]; 5.作为typeDef: typedef returnType(^typeName)(parameterTypes) TypeName blockName = ^returnType(parameters) { ... ... }

黑幕背后的__block修饰符

久未见 提交于 2020-02-05 22:44:55
我们知道在Block使用中,Block内部能够读取外部局部变量的值。但我们需要改变这个变量的值时,我们需要给它附加上__block修饰符。 __block另外一个比较多的使用场景是,为了避免某些情况下Block循环引用的问题,我们也可以给相应对象加上__block 修饰符。 为什么不使用__block就不能在Block内部修改外部的局部变量? 我们把以下代码通过 clang -rewrite-objc 源代码文件名重写: 1 int main(int argc, const char * argv[]) { 2 @autoreleasepool { 3 int val = 10; 4 void (^block)(void) = ^{ 5 NSLog(@"%d", val); 6 }; 7 block(); 8 } 9 return 0; 10 } 得到如下代码: 1 struct __main_block_impl_0 { 2 struct __block_impl impl; 3 struct __main_block_desc_0* Desc; 4 int val; 5 __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _val, int flags=0) : val(_val) { 6