C Primer Plus学习笔记——C99/C11新特性

C Primer Plus学习笔记(一) C Primer Plus第一章笔记: 主要了解C语言的起源、优缺点和常用的C语言标准,简单描述了计算机的工作原理和C语言的编程机制,概括了常用的C语言编译器和在不同操作系统中的C编程,探讨C语言编程的七个步骤 为学习C语言打下坚实的基础 阅读详情

说明

本文档性质为个人学习笔记。

在阅读《C Primer Plus(第六版)中文版》时,记录下的需要备忘的知识点,主要关注在C99和C11特性的描述上。

第17章 高级数据表示 未做记录,因为暂时用不到那里。记录的要点主要是提醒备查所以不会过于详细。

第一、二章 初识C语言+C语言概述

P24 C99/C11支持将声明放在块中的任何位置

P25 C99/C11允许使用更长的标识符名

但是编译器只识别前63个字符。对于外部标识符,只允许使用31个字符。(以前C90只允许6个字符,这是一个很大的进步,旧式编译器通常最多只允许使用8个字符。)实际上,你可以使用更长的字符,但是编译器会忽略超出的字符。

P385:在以前的标准中,编译器识别局部标识符前31个字符和外部标识符前6个字符。…外部变量名比局部变量名的规则严格,是因为外部变量名还要遵循局部环境规则,所受的限制更多。

P34 C99/C11新增关键字

C99新增关键字signed、const、enum、volatile

C11新增关键字_Alignas、_Alignof、_Atomic、_Bool、_Complex、_Generic、_Imaginary、_Noreturn、_Static_assert、_Thread_local

第三章 数据:数据类型关键字

P47 C99新增数据类型

C99新增数据类型:long long、unsigned long long int、unsigned long long

P55 C99新增可移植类型stdint.h和inttype.h

例如:

精确宽度整数类型:int32_t等

最小宽度类型:int_least8_t等

最快最小宽度类型:int_fast8_t等

最大整数类型:intmax_t、uintmax_t等

同时提供相应的输入和输出,但是编译器对C99实现程度却各不相同。

P59 C99/C11可选项:浮点数表示标准ISO/IEC/IEEE 60559:2011

ISO/IEC/IEEE 60559:2011 IEEE 754

IEEE 754(e)规定了计算机系统中浮点运算的格式和方法-具有单精度、双精度、扩展精度和扩展精度的标准函数和扩展函数,并推荐了数据交换的格式。 定义了异常条件,并指定了对这些条件的标准处理。 它提供了一种使用浮点数进行计算的方法,无论处理是在硬件、软件还是两者的组合中进行,都将产生相同的结果。 给定相同的输入数据,计算结果将是相同的,与实现无关。 数学处理中的错误和错误条件将以一致的方式报告,而不管实现如何。

P60 C11可选项:复数软件包

复数的实部和虚部类型都基于实浮点类型来构成:

float _Complex

double _Complex

long double _Complex

float _Imaginary

double _Imaginary

long double _Imaginary

第四章 printf()和scanf()

P75 C99/C11专门为sizeof运算符的返回类型添加了%zd转换说明,这对于strlen()同样适用

对于早期C,还要知道sizeof和strlen()返回的实际类型值(通常是unsigned或unsigned long)。

P80 C90/C99规定了printf()和scanf()函数的标准版本

第六章 循环

P148 C99提供的stdbool.h头文件

该头文件让bool成为_Bool的别名,还把true和false分别定义为1和0的常量。包含该头文件后,写出来的代码可以与C++兼容,因为C++把bool、true、false定义为关键字。

第九章 函数

P253 C99标准不再支持int类型函数的这种假定设置

如果没有声明函数的类型,旧版本的编译器会假定函数的类型是int。

第十章 数组和指针

P281 C99指定初始化器

该特性可以初始化指定的数组元素。例如只初始化数组中的最后一个元素,对于传统的C初始化语法,必须初始化最后一个元素之前的所有元素,才能初始化它。而C99规定,可以在初始化列表中使用带方括号的下标指明待初始化的元素。

int arr[6] = {[5] = 212};

对于一般的初始化,在初始化一个元素后,未初始化的元素都会被设置为0。

指定初始化器的两个重要特性:

一、如果指定初始化器后面有更多的值,那么后面这些值将被用于初始化指定元素后面的元素。

二、如果再次初始化指定的元素,那么最后的初始化将会取代之前的初始化。

P284 数组大小的指定

在C99标准之前,声明数组时只能在方括号中使用整型常量表达式。所谓整型常量表达式,是由整型常量构成的表达式。

sizeof表达式被视为整型常量,但是(与C++不同),const值不是。

C99/C11允许在声明变长数组时使用const变量。

P310 C99/C11 VLA变长数组

C99创建了一种新型数组,称为变长数组(variable-length array)或简称VLA。

C11放弃了这一创新的举措,把VLA设定为可选,而不是语言必备的特性。

C99引入变长数组主要是为了让C成为更好的数值计算语言。

变长数组有一些限制。变长数组必须是自动存储类别,这意味着无论在函数中声明还是作为函数形参声明,都不能使用static或extern存储类别说明符。而且不能在声明中初始化它们。

变长数组中的“变”不是指可以修改已创建数组的大小。而是在创建数组时,可以使用变量指定数组的维度。

变长数组在声明时应保证其使用的变量在其之前被声明。

int sum2d(int rows, int cols, int ar[rows][sols]);//正确
int sum2d(int ar[rows][sols], int rows, int cols);//错误

C99/C11规定,可以省略原型中的形参名,但是在这种情况下,必须使用星号来代替省略的维度。

int sum2d(int, int, int ar[*][*]);

P312 C99新增复合字面量

字面量是除符号常量以外的字面量。发布C99标准的委员会认为,如果有代表数组和结构内容的复合字面量,在编程时会更方便。

对于数组,复合字面量类似数组初始化列表,前面是用括号括起来的类型名。例如:

(int [2]){10, 20}

初始化有名数组时可以省略数组大小,复合字面量也可以省略大小。

因为复合字面量是匿名的,所以不能先创建再使用它,必须在创建的同时使用它。使用指针记录地址就是一种用法。

int * pt1;
pt1 = (int [2]){10, 20};

复合字面量是提供只临时需要的值的一种手段。复合字面量具有块作用域,这意味着一旦离开定义复合字面量的块,程序将无法保证该字面量是否存在。

第十一章 字符串和字符串函数

P335 C11新增gets_s()可选函数

第十二章 存储类别、链接和内存管理

P375 C99允许在块中的任意位置声明变量

而在以前,具有块作用域的变量都必须声明在块的开头。而现在可以这样写:

for(int i = 0; i<10; i++)
{
    printf("A C99 Feature: i = %d", i);
}

为了适应这个新特性,C99把块的概念扩展到包括for循环、while循环、do while循环和if语句所控制的代码。即使这些代码没有用花括号括起来,也算是块的一部分。

函数作用域(function scope)仅用于goto语句的标签。

P402 ANSI C类别限定符

C90新增的两个属性:恒常性(constancy)和易变性(volatility)。这两个属性可以分别使用关键字const和volatile来声明,以这两个关键字创建的类型是限定类型(qualified type)。

C99标准新增了第三个限定符:restrict,用于提高编译器优化。restrict允许编译器优化某部分代码以更好地支持计算。**它只能用于指针,表明该指针是访问数据对象的唯一且初始的方式。

int * restrict p = (int *) malloc(10 * sizeof(int));

编译器不会检查用户是否遵循这一限制,但是无视它后果自负。

C11标准新增了第四个限定符:_Atomic。C11提供一个可选库,由stdatomic.h管理,以支持并发程序设计,而且_Atomic是可选支持项。

要通过各种宏函数来访问原子类型。当一个线程对一个原子类型的对象执行原子操作时,其他线程不能访问该对象。

_Atomic int hogs;       //hogs是一个原子类型的变量
atomic_store(&hogs, 12);//stdatomic.h中的宏

C99为限定符增加了一个新属性:它们现在是幂等的(idempotent)。其意思是可以在一条声明中多次使用同一个限定符,多余的限定符将被忽略。

P406 C99允许把类型限定符和存储类别说明符static放在函数原型和函数头的形式参数的初始方括号中

void ofmouth(int  * const a1, int * restrict a2, int n);//以前的风格
void ofmouth(int a1[const], int a2[restrict], int n);//C99允许

根据新标准,在声明函数形参时,指针表示法和数组表示法都可以使用这两个限定符。

static的情况不同,因为新标准为static引入了一种与以前用法不相关的新用法。现在,static除了表明静态存储类别变量的作用域或链接外,新的用法告知编译器如何使用形式参数。例如:

double stick(double ar[static 20]);

static的这种用法表明,函数调用中的实际参数应该是一个指向数组首元素的指针,且该数组至少有20个元素。

第十三章 文件输入/输出

P417 C11增加了带x字母的写模式

第一,如果以传统的一种写模式打开一个现有文件,fopen()会把该文件的长度截为0,这样就丢失了文件的内容。但是使用带x字母的写模式,即使fopen()操作失败,原文件的内容也不会被删除。

第二,如果环境允许,x模式的独占特性使得其它程序或线程无法访问正在被打开的文件。

第十四章 结构和其他数据形式

P443 C99/C11为结构提供了指定初始化器(designated initializer)

P462 C99新增结构的复合字面量

语法是把类型名放在圆括号中,后面紧跟一个用花括号括起来的初始化列表。例如:

(struct book) {"Name", "Author", 6.99}

P463 C99新增伸缩型数组成员(flexible array member)

有以下特性:

第一,该数组不会立即存在。

第二,使用这个伸缩型数组成员可以编写合适的代码,就好像它确实存在并具有所需数目的元素一样。

声明一个伸缩型数组成员有如下规则:

1.伸缩型数组成员必须是结构的最后一个成员

2.结构中必须至少有一个成员

3.伸缩数组的声明类似于普通数组,只是它的方括号中是空的

实际上,C99的意图不是使用含有伸缩型数组成员的结构声明变量,而是希望你声明一个指向该结构的指针,使用malloc分配足够的空间,以便存储结构中的常规成员和伸缩型数组成员需要使用的空间。

对于这类带有伸缩型数组成员的结构,有以下特殊的处理需求:

1.不能用结构赋值或拷贝

2.不要以按值方式把这种结构传递给结构

3.不要使用带伸缩型数组成员的结构作为数组成员或另一个结构的成员

P465 C11匿名结构

struct pic_size
{
    int h;
    int w;
    int other[20];
};
struct pic
{
    int id;
    struct pic_size size;//嵌套结构成员
};
struct pic p1 = {17, {1920, 1080, {10, 20, 30}}};

在C11中,可以使用嵌套的匿名成员结构定义:

struct pic
{
    int id;
    struct {int h; int w; int other[20];};
};

初始化的方式相同。在访问时简化了步骤,匿名结构中的成员可以直接由如pic.w的形式访问。

P473 C11匿名联合

匿名联合和匿名结构的工作原理相同,即匿名联合是一个结构或联合的无名联合成员。

第十五章 位操作

P515 C11对齐特性

C11的对齐特性比用位填充字节更自然,它们还代表了C在处理硬件相关问题上的能力。这种上下文中,对齐指的是如何安排对象在内存中的位置。

_Alignof运算符给出一个类型的对齐要求,在关键字_Alignof后面的圆括号中写上类型名即可:

size_t d_align = _Alignof(float);

可以使用_Alignof说明符指定一个变量或类型的对齐值。但是,不应该要求该值小于基本对齐值。例如,如果float类型的对齐要求是4,不要请求其对齐值是1或2。

该说明符用作声明的一部分,说明符后面的圆括号内包含对齐值或类型:

_Alignof(double) char c1;
_Alignof(8) char c2;
unsigned char _Alignof(long double) c_arr[sizeof(long double)];

在程序中包含stdalign.h头文件后,就可以把aligns和alignof分别作为_Alignas和_Alignof的别名。这样做可以与C++关键字匹配。

C11在stdlib.h库还添加了一个新的内存分配函数,用于对齐动态分配的内存。该函数原型如下:

void *alignof_alloc(size_t alignment, size_t size);

第1个参数代表指定的对齐,第2个参数是所需的字节数,其值应是第1个参数的倍数。与其他内存分配函数一样,要使用free()函数释放之前分配的内存。

第十六章 C预处理器和C库

P539 C99提供预定义标识符__func__

C99标准提供一个名为__func__的预定义标识符,它展开为一个代表函数名的字符串(该函数包含该标识符)。

那么__func__必须具有函数作用域,而从本质上看宏具有文件作用域。因此,__func__是C语言的预定义标识符,而不是预定义宏。

P540 C11支持的#line和#error预处理指令

#line指令重置__LINE__和__FILE__宏报告的行号和文件名。

#error指令让预处理器发出一条错误消息,该消息包含指令中的文本。

P541 C11泛型选择和_Generic关键字

泛型编程(generic programming)指那些没有特定类型,但是一旦指定一种类型,就可以转换成指定类型的代码。

C11新增了一种表达式,叫做泛型选择表达式(generic selection expresson),可根据表达式的类型(即表达式的类型是int、double还是其他类型)选择一个值。

泛型选择表达式不是预处理器指令,但是在一些泛型编程中它常用作#define宏定义的一部分。

P542 C99内联函数(inline function)

编译器查看内联函数的定义(也是原型),可能会用函数体中的代码替换函数调用,也就是说,效果相当于在函数调用的位置输入函数体中的代码。编译器优化内联函数必须知道该函数定义的内容。这意味着内联函数定义与函数调用必须在同一个文件中。一般情况下,内联函数都具有内部链接。

标准规定具有内部链接的函数可以成为内联函数,还规定了内联函数的定义与调用该函数的代码必须在同一个文件中。因此,最简单的方法是使用函数说明符inline和存储类别说明符static。

#include <stdio.h>
inline static void example()//内联函数定义/原型
{
    printf("This message is from a inline function.");
}

int main()
{
    ...
    example();//内联函数调用
    ...
}

一般不在头文件中放置可执行代码,内联函数是个特例。

与C++不同的是,C还允许混合使用内联函数定义和外部函数定义(具有外部链接的函数定义)。

P544 _Noreturn函数

C99新增inline关键字时,它是唯一的函数说明符(关键字extern和static是存储类别说明符,可应用于数据对象和函数)。C11新增了第二个函数说明符_Noreturn,表明调用完成后函数不返回主调函数。

exit()函数是_Noreturn函数的一个示例。

P550 C99标准提供的tgmath.h库定义了泛型类型宏

P557 C11新增特性_Static_assert声明

assert()表达式是在运行时进行检查。C11新增了一个特性:_Static_assert声明,可以在编译时检查assert()表达式。

因此,assert()可以导致正在运行的程序中止,而_Static_assert()可以导致程序无法通过编译。

_Static_assert()接受两个参数,第1个参数是整形常量表达式,第2个参数是一个字符串。如果第一个表达式求值为0(或false),编译器会显示该字符串,而且不编译该程序。

————2020-1-9@燕卫博————

C语言的C89、C99和C11标准(上) 一、C99针对C89的改变 1.增加了restrict指针 通过restrict修饰指针,可以确保两个指针不能指向同样的内存空间。 如memcpy函数在C99标准下的定义为 void *memcpy(void *restrict s1, const void *restrict s2,size_t size); 2.增加inline关键字 和C++一样,通过inline函数可以创建内联函数,提高代码的编译效率和执行效率。 3.新的数据类型 C99标准支持一些新的数据类型 布尔类型:bool 复数类型:flo 阅读详情

相关推荐

C语言自学指南:从《C Primer Plus》到项目实战的完整路线

C语言作为计算机编程的基石,其核心在于对内存和硬件的直接操作能力。理解其工作原理,如指针和内存管理,是掌握系统编程、嵌入式开发等底层技术的关键。这些基础概念不仅决定了程序的效率与稳定性,更是学习数据结构、操作系统等高级课程的必备前提。通过体系化的教材与循序渐进的实践,学习者能将语法知识转化为解决实际问题的工程能力。本文以《C Primer Plus》这本经典教材为主线,结合**指针**和**内存管理**等核心热词,为自学者提供从环境搭建、概念攻克到综合项目开发的完整学习路径,帮助读者避开常见误区,扎实构建C

weixin_30522183的博客 344

C11与C99的变化对比

C11标准曾用名C1X。 C11标准是C语言标准的第三个版本,前一个标准版本是C99标准。2011年12月8日,国际标准化组织(ISO)和国际电工委员会 (IEC)旗下的C语言标准委员会正式发布了C11标准。 C11标准的最终定稿草案是免费开放的,但是正式标准文件是需要付费的。 当前,支持此标准的主流C++编译器有:GCC、Clang、Intel C++ Complier等。 相比...

Panda的成长记录 1万+

《C Primer Plus》习题第十章复习题

复习题 1.下面的程序将打印什么内容? #include <stdio.h> int main(void){ int ref[] = { 8, 4, 0, 2 }; int *ptr; int index; for (index = 0, ptr = ref; index < 4; index++, ptr++) printf("%d %d\n", ref[ind...

编程爱好者的博客 2066

C89标准、C99标准、C11标准的区别

用于指出__func__所存放的函数名,类似于字符串赋值。

点滴路程 4万+

C语言规范:C99与C11的详细区别及代码示例

特性C99C11主要变化对齐支持无_Alignas_Alignof新增对齐控制关键字匿名结构/联合无支持允许嵌套匿名结构/联合泛型选择无_Generic新增类型选择宏多线程支持无标准多线程支持边界检查函数无*_s系列函数新增安全函数静态断言无编译时断言复数类型支持扩展增强复数操作gets()函数支持废除删除不安全函数新增头文件部分支持新增多个如等增强安全性:引入边界检查函数,删除不安全的gets()提升性能:添加对齐控制、原子操作等特性。

1556

从ARM转战TI DSP:手把手教你用CCS 10.1.1搭建F280049C的第一个工程(含CMD文件避坑指南)

本文详细介绍了从ARM开发转向TI DSP(TMS320F280049C)的完整流程,包括CCS 10.1.1开发环境配置、工程搭建、CMD文件避坑指南以及外设开发实战。特别针对ARM开发者常见的DSP特性差异问题提供了解决方案,帮助初学者快速入门DSP开发。

weixin_42536058的博客 372

ANSI、C99、C11 标准区别详解

一、ANSI C 标准 美国国家标准协会(ANSI)为创立 C 语言的一套标准,于 1989 年完成,因此常被称为 C89。 在 KEIL 中使用的是 ANSIC C 标准(C89 标准),定义变量一定要放在语句块开头,在 KEIL 中也可以选择 C99 标准。 二、C99 标准 C99 标准是在 ANSI 标准基础上新增了一些特性,如: (1)支持不定长的数组,即数组长度可以在运行时决定。...

devilzcl的博客 1万+

B0505S选型

    使用B0505S-1W已经有一段时间了,一直以来使用的是下面的电路,该电路摘自《CAN总线嵌入式开发——从入门到实战》一书。 参考金升阳的用户手册,手册上写道: 为了确保该模块能够高效可靠的工作,使用时,其输出最小负载不能小于额定负载的10%。若您所需功率确实较小,请在输出端并联一个电阻(电阻消耗功率与实际使用功率之和大于等于10%的额定功率)        由于使用该电源模...

动感小麦兜的博客 1万+

C Primer Plus 学习笔记第一章

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

qq_2975670963的博客 2100

别再只画GO图了!用R语言+Perl脚本搞定单细胞KEGG富集分析与圈图(附完整代码)

本文详细介绍了如何利用R语言和Perl脚本实现单细胞KEGG富集分析全流程,从基因ID转换到专业圈图可视化。通过对比KEGG与GO分析的互补价值,提供完整的代码实现和优化技巧,帮助研究者高效完成单细胞测序数据的通路分析,并生成高质量的圈图展示结果。

weixin_28694169的博客 402

电磁波成像技术全解析:从γ射线到无线电波的应用实践

本文全面解析电磁波成像技术,从γ射线到无线电波的应用实践。详细介绍了不同波长电磁波的特性与实用场景,包括医疗影像、工业检测、安防监控等领域。特别探讨了X射线、红外热成像、毫米波雷达等前沿技术的实战应用,为读者提供技术选型指南和操作技巧。

weixin_29305337的博客 292

C Primer Plus(二)

重读C Primer Plus ,查漏补缺小说搜索 https://shupu.org/   重读C Primer Plus,记录遗漏的、未掌握的、不清楚的知识点 分支和跳转   1、ctype.h头文件里包含了一些列用于字符判断的函数,包括判断数字、大小写字母,控制字符,可打印字符等一些列函数以及转换字母大小写的字符映射函数。   2、C99标准要求编译器支持至少127层if-el...

终极冥帝 424

局部,全局(外部),static等变量详解

首先,必须明白一个程序是包含若干个源文件,每个源文件又是包含若干个函数,每个源文件、函数中又定义了若干个变量。但是每个变量都有自己的作用范围,也就是自己的作用域。只有在作用域内才可以访问变量。 变量的有效范围称为变量的作用域( scope)。归纳起来,变量有4种不同的作用域:文件作用域( file scope)、函数作用域( function scope)、块作用域(block sc...

归根结底不优秀的博客 1322

《C Primer Plus》学习笔记—第10章

数组,初始化,const运算符; 数组边界,数组索引,指针; 二维数组,多维数组; 函数、数组和指针,指针形参; 指针表示法,数组表示法; 指针操作,const的使用; 变长数组VLA; 复合字面量

chaofeng426的博客 1132

Upwork数据战争:用爬虫与AI预测垄断订单

当普通自由职业者还在“等客户发需求”时,顶尖玩家已用数据预测客户明天需要什么; 当竞争对手熬夜抢单时,你的爬虫早已自动提交提案—— 这不是科幻,而是2025年的现实! 本文将手把手教你用合法工具搭建“数据战情室”,让每个决策都有万亿级数据支撑!

qq_61813593的博客 980

【华为OD机试真题 新系统】1010、魔法阵的能量收集 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 新系统】1010、魔法阵的能量收集 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2026e卷,od机试,2026E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2026华为od,如何备战华为

KJ.JK 1071

《C Primer Plus》总结

《C Primer Plus》总结 %p 可以输出指针,%% 可以打印 “%” , %d 等价 %i %u 表示无符号十进制数。 printf 中参数列表使用的是变量 和 常量 以及表达式的值。 char 、 unsigned char 、 signed char 的区别: char 的最高位为符号位,与 unsigned char表示范围不同; char 在不同编译器中的具体解释与实现不同。 将 char 赋值给int 或lang时,会对 char 的最高位进行扩展。 如: char a =

大脸嫩柴的博客 795

5.7 BGP属-ORIGIN

注意:当去往同一个目的地存在多条不同Origin属性的路由时,在其他条件都相同的情况下,BGP将按如Origin的下顺序优选路由:IGP > EGP > Incomplete。通过以上输出可以看到路由表选择了R3发过来的路由,因为R1的路由的起源为?通过以上输出我们可以看到针对于1.1.1.1这条路由有两条,从R1和R3传过来的起源都属于IGP。(4)把从R1传过来的路由的起源改为incomplete。通过以上输出可以看到,从R1传过来的路由是最优的。(2)在R2上查看1.1.1.1的路由详细信息。

lwljh134的博客 308

《C Primer Plus》学习笔记—第3章

变量,常量; 基本数据类型 转义序列 整数类型 int,char,double,float,short,long,unsigned 进制

chaofeng426的博客 608

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C primer plus 学习笔记_第一章 初识C语言

一级标题 二级标题 #include<stdio.h> int main() { int a[20],n; a[0] = a[1] = 1; printf("%d\n%d\n", a[0], a[1]); for (n = 2; n < 20; n++) { a[n] = a[n - 1] + a[n - 2]; printf("%d\n", a[n]); } return 0; } 改进: #include<stdio.h> int main() {

weixin_50475073的博客 986

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C Primer Plus 第4章——第一篇

P71~P92

weixin_45641816的博客 1365

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C Primer Plus: 第十章 数组和指针

C Primer Plus: 第十章 数组和指针 10.1 数组 数组是一种派生类型。 C99之前是不允许变长数组的,如:float a[n]; 10.3 指针和数组 在C中,指针加1指的是增加一个存储单元。对数组而言,这意味着加1后的地址是下一个元素的地址,而不是下一个字节的地址。 10.4 函数、数组和指针 函数原型,下面四种原型都是等价的: int ...

budding0828 580

书海拾遗系列之《C Primer Plus》:第二章 C语言概述

这个Blog里以《C Primer Plus(第6版》为基础,重新梳理细枝末节的知识点,毕竟知识用得多了才不会变成冷知识。本篇文章介绍了main()函数的合法形式(C99和C11支持),变量命名需要注意的细节,以及命名时应该避免使用的关键字和保留名称,适用于菜鸟学习,老鸟回顾

LegendOfBear的博客 216

C Primer Plus 习题

学习笔记--一刷

weixin_70940338的博客 510

C Primer Plus

C Primer Plus作为一本被人推崇备至的c入门经典,C primer plus绝非浪得虚名。应该算得上C教材里最好的入门书了。在知识广度上,很少有书能匹及。它能为你系统学习c提供一个良好的平台。作者对c的见解精辟。在娓娓叙述的同时,作者辅以大量程序以分析。它让我对C有了更加系统的全新认识。决非国人所写的那些公理化的教条说教,我觉得作者把自己的心血全部吐露。书很厚,近700页,却不...

royzou的专栏 2372

学习笔记-C primer Plus 第6章 ——循环

学习笔记-C primer Plus 第6章 1.scanf()函数:返回成功读取项的数量,如果成功读取一个,则返回1,如果读取失败则返回0,注意,如果scanf转换值之前除了问题,则会返回一个特殊值EOF。其值通常定为-1. 2.在while循环中利用scanf函数的返回值可以避免循环交互输入时的棘手问题。 3.关系运算符用来比较浮点数时,要注意会出现误差,可以使用fabs()函数方便的比较浮点数,该函数返回的是一个浮点数的绝对值。 4.1是true,0是false 5.注意赋值和比较的区别,也就是=和=

bengba_dragon的博客 313
上一篇: C Primer Plus学习笔记——C语言特性备忘
下一篇: RT3070-STA驱动程序编译步骤
燕卫博
博客等级 码龄7年 312粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值