做公司网站优劣势,电子类 购物网站,安康市相亲平台,网页设计代码html个人简介文章目录 相同点不同点cin和scanf()结构体struct指针#xff1a;NULL、nullptr、void* 有一段时间没有发博客了#xff0c;从笔记里摘录一些发两篇。 相同点
C有很多从C继承过来的东西#xff0c;因此C书(《C Primer》、《C Primer Plus》)中有一些基础的东西讲的并没有C书… 文章目录 相同点不同点cin和scanf()结构体struct指针NULL、nullptr、void* 有一段时间没有发博客了从笔记里摘录一些发两篇。 相同点
C有很多从C继承过来的东西因此C书(《C Primer》、《C Primer Plus》)中有一些基础的东西讲的并没有C书详细。
基础的东西完全相同数据类型、类型转换、变量常量、预处理器、运算符、流程控制。
以下是一些值得强调的相同点
1、charchar在默认情况下既不是没有符号也不是有符号是否有符号由C或C编译器实现决定。
因此char的范围可能是-128~127也可能是0~255。如果只用char处理字符那么char前面无需使用任何修饰符。如果char有某种特定的行为对您来说非常重要则可以显式地将类型设置为signed char或unsigned char。 相关描述《C Primer Plus》3.5.8 char类型:字符和小整数 - 第5点、《C Primer Plus》3.4.3 使用字符:char类型 - 第5点 2、在赋值语句中等号()右边的类型自动转换为等号左边的类型。这条自动类型转换的规则同样也适用于强制类型转换因此这种情况下可以不使用强转运算符。(—为什么不需要类型转换)
3、自动类型转换都有整型提升、“算术转换”。
4、预处理器C的预处理器继承自C。 C的两本书对预处理的介绍都非常少分别在《C Primer》2.6.3编写自己的头文件-预处理器概述、《C Primer Plus》2.1.3 C预处理器和iostream文件 | 3.1.3整型short、int、long和long long - 符号常量-预处理器方式用了很少的篇幅做了简单的介绍。
5、静态变量 (真正的解释) 《C Primer Plus》12.1.6块作用域的静态变量12.1.7外部链接的静态变量12.1.8内部链接的静态变量12.1.10存储类别说明符 《C Primer Plus》9.2.3 静态持续变量9.2.4静态持续性、外部链接性9.2.5静态持续性、内部链接性9.2.6静态存储持续性、无链接性9.2.7说明符和限定符 静态变量听起来自相矛盾像是一个不可变的变量。实际上静态的意思是该变量在内存中原地不动并不是说它的值不变。 以前我总以为静态变量只是static修饰的变量即静态局部变量和静态全局变量。实际上静态变量还包括普通全局变量。 即静态变量包括平时所谓的静态局部变量、静态全局变量、普通全局变量(尽管它不用static修饰)。严格来说它们分别被描述为块作用域的静态变量、内部链接的静态变量、外部链接的静态变量。
静态变量和非静态变量的默认初始值 非静态变量也就是普通的局部变量程序在进入到该变量的声明所在块时才为其分配内存在退出该块时释放之前分配的内存。如果没有手动初始化该变量的默认初始值可能是受内存残留影响的垃圾值是不确定的。 静态变量(静态局部/全局变量、普通全局变量)由于静态变量的数目在程序运行期间是不变的因此程序不需要使用特殊的装置(如栈)来管理它们。编译器将分配**固定大小的内存块(静态全局区)**来存储所有的静态变量这些变量在整个程序执行期间一直存在。如果没有手动初始化静态变量编译器将把它设置为0。 ChatGPT-静态全局区是固定大小的吗静态全局区的大小会在编译时确定在程序运行之前分配一旦程序开始执行它的大小就是固定的不会动态变化。 不同点
auto关键字
C语言中用于声明自动存储类别的局部变量是局部变量的默认存储类别。由于缺乏明确性auto关键字已经被废弃。C11中auto关键字用来推断变量的类型会根据初始化表达式的类型自动推断其类型这样可以使代码更加简洁减少手动写出变量类型的繁琐。
头文件名C的头文件有扩展名.h而C的头文件名去掉了任何扩展名。
函数C的函数形参支持设置默认值、函数可以重载C不行其它都一样。
动态内存分配C/C——动态内存分配
C用的是malloc、free函数。C用的是new、delete关键字。
枚举C枚举的一些特性并不适用于C。例如C允许枚举变量使用 运算符但是C标准不允许。。 (《C Primer Plus》14.11.1 enum常量)
cin和scanf()
cin value_holder;value_holder为存储输入的内存单元它可以是变量、引用、被解除引用的指针也可以是类或结构体的成员。 (《C Primer Plus》17.3 使用cin进行输入)
scanf()scanf()使用的参数类型是指向变量的指针即变量的地址。 (《C Primer Plus》4.4.5 使用scanf())
简单说cin接收的是本身(不是指针)scanf()接收的是变量的地址(是指针)。
结构体struct C中结构体和C中结构体的区别 C的struct和C的class一样唯一区别是默认访问权限不一样(struct是publicclass是private)。
默认成员访问权限 C没有访问权限的概念因此struct的所有成员都具有公共的访问权限。C的struct的默认成员访问权限是public。可以使用访问控制符修改成员的访问权限。 成员函数 C的struct只能包含成员变量不能包含成员函数。C的struct可以包含成员函数与class一样。 成员变量的初始化C不能在结构体中初始化成员变量而C结构体可以。空结构体C的空结构体的sizeof为0C的空结构体的sizeof为1。结构体类型名C结构体在定义时除非使用typedef否则之后定义变量都必须使用的类型名是struct 结构体名而C结构体可以省略struct直接使用结构体名。
指针NULL、nullptr、void* 参考 C中NULL和nullptr的区别、【c】 NULL和nullptr的区别和联系 NULL用来表示空指针给指针类型赋值nullptr是C11引入的也用来表示空指针用来替代NULLvoid*是通用指针类型、空类型指针。C语言的NULL是宏定义值是((void*)0)即把0强制转换为void*。也就是说NULL是void*类型的。C语言中void*类型可以和任意类型的指针互相进行隐式转换不需要考虑类型是否匹配。C的NULL也是宏定义值是整数0是int类型的。之所以不使用((void*)0)是因为C要求在把void*指针赋给任何类型的指针时必须进行强制类型转换这在给指针变量赋值为NULL时显然很不方便。C的整数0可以直接赋值给指针所以在C中NULL的值是0。
C为什么又要有nullptr呢因为当具有如下的重载函数时如果实参是NULL那么NULL作为int类型会触发调用第一个但通常我们希望调用的是第二个。
void fun(int){}
void fun(void*){}为了解决这个问题C11特意引入了nullptr这一新的关键字来表示空指针nullptr的类型是std::nullptr_t这个类型可以隐式转换为任意一个指针类型不能转为非指针类型。因此当实参是nullptr时就会触发第二个重载函数这是我们希望的。所以在C中应该使用nullptr表示空指针。