美文网首页C++
学习笔记C++(预处理、const、sizeof)

学习笔记C++(预处理、const、sizeof)

作者: 灿烂的GL | 来源:发表于2018-05-10 21:10 被阅读7次

1、宏定义(详细文档


题一题分析连接

ps: 关于题补充记忆:&array[5]表示array[5]的地址 - 索引

*&array[5]表示array[5] - 数值

概念要点一:宏只是文本替代,完完全全原样替代

eg:

#include /*宏定义在文件头和函数之间*/

#define S(a,b) a*b //需要注意的是S和()之间不能有空格

main()

{

int area;area=S(2+3,3+4);

printf("area=%d\n",area);

}

>>这里输出竟然是15,并不是我们想象中的35,怎么回事呢?  实际上S(2+3,3+4)传递过去后,它的红替换是 area=2+3*3+4,这下大家明白了吧。


题二分析连接

PS:主要是int最大值是32767,针对可能溢出添加UL,有别于官方答案这只作者运行答案:#define  SEC_PER_YEAR  (1UL*356*24*60*60)  


题三:const与define的区别

const用于类成员变量定义,一旦定义且不能改变其值。

define定义全局常量,在任何地方都可以访问。

define不能在类中定义而const可以。

const不能在条件语句中定义常量


题四:修改类的成员变量怎么办(添加mutable


题五:考察seizeof用法

要点一:基础字节数复习

char :1个字节

char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)

short int : 2个字节

int:  4个字节

unsigned int : 4个字节

float:  4个字节

double:   8个字节

long:   4个字节

long long:  8个字节

unsigned long:  4个字节

要点二:直接看例子

char* ss1 = "0123456789"

cout<<sizeof(ss1)<<" "

输出为4(这里ss1就是字符指针,指针大小为定值4)

同样的对于这种情况

int *p = NULL;

printf ("sizeof(*p)= %d\n", sizeof(*p));//虽然p没有指向任何变量,但是定义的指向类型是int,

printf ("sizeof(p) = %d\n", sizeof(p));//这里则指向的是指针类型

int a[100];

printf("sizeof(a) = %d\n", sizeof(a)); //作为数组名a可以看成指针,但是这里代表整个数组的大小,分配100,每个占4,总共400

 printf("sizeof(a[100]) = %d\n", sizeof(a[100]));//4

 printf("sizeof(&a[0]) = %d\n", sizeof(&a[0]));//4

 printf("sizeof(&a) = %d\n", sizeof(&a));//400

还有不要忽略“\0”

char ss[] = "0123456789"

这里的seizeof(ss)为11(10+1)

在看看结构体

struct{short1;short2;short3}A;

struct{long a1;short a2}B;

结构体默认对其为8字节,seizeof(A)结构体中三个short类型,每个short对应2字节,所以总字节为6,是2的整数倍

关键来了,seizeof(B)结构体中一个short类型和一个long(4字节),总字节为6,不是4的整数倍,所以这里补空字节到8,即seizeof(B)=8


题六:(内存中数据对其问题)先看两个例子

eg:

class A1{  char c;int a;char d;};

class B1{  char c;char d;int a};

这里sizeof(A1)返回12,sizeof(B1)返回8

形象说下就是这样,对于A1存储结构值

char~~~(4)

----int---(4)

char~~~(4)

对于B1存储结构是

charchar~~(4)

----int----(4)

eg:

class C1{ public;  char c;int a;char d;};

class D1{  public;  char c;char d;int a};

注:这里是静态变量,存放的是全局数据区,所以sizeof计算步骤为先计算类型的字节数,不足的通过里面的字类型取其倍数补齐,这里是总字节是6,最大字节是int4字节,所以补全为8


题七:sizeof和strlen的区别(参考

最主要的是seizeof可以用类型做参数,strlen只能用char*做参数,且必须是以“\0”结尾的,拿上边的一个例子变形来说

char ss[100] = "0123456789"

这里的seizeof(ss)为100,对于strlen(ss)则为10,它内部实现是用循环计算字符串长度直到“\0”


题八:内联函数和宏定义的差别

宏操作的是 token, 可以进行 token的替换和连接等操作,在语法分析之前起作用。而函数是语言中的概念,会在语法树中创建对应的实体,内联只是函数的一个属性。

对于问题:有了函数要它们何用?答案是:一:函数并不能完全替代宏,有些宏可以在当前作用域生成一些变量,函数做不到。二:内联函数只是函数的一种,内联是给编译器的提示,告诉它最好把这个函数在被调用处展开,省掉一个函数调用的开销(压栈,跳转,返回)。

这段摘自知乎提问感觉比较通俗易懂


以上内容来自《程序员面试宝典》第六章习题和自己的搜索及理解,找实习找工作...陆续会刷一些题补一些知识,希望一起成长

相关文章

  • 学习笔记C++(预处理、const、sizeof)

    1、宏定义(详细文档) 题一题分析连接 ps: 关于题补充记忆:&array[5]表示array[5]的地址 - ...

  • 预处理,const,sizeof

    1.宏定义 用宏定义去求一个结构体struct里某个变量相对struct的偏移量。要求偏移量首先struct a;...

  • C++学习笔记一:sizeof

    【缘由】 最近的考试基本都跪了。还是想知耻而后勇。 所以,想把之前在学校学习过的一些专业,再自学一遍、整理自学笔记...

  • 机器学习笔记

    精品笔记 ML AI 斯坦福机器学习笔记 GTD 数据预处理 数据预处理 预处理终版.

  • 条款 03:尽可能使用 const

    《Effective C++ 中文版 第三版》读书笔记 条款03:尽可能使用 const 面对指针: const ...

  • Preprocessor

    预处理命令(主要有三种) 宏定义 文件包含 条件编译 宏定义如: 由于 C++已增加了 const 语句定义常量,...

  • C++ 快速入门笔记:进阶编程

    C++入门笔记:高级编程 文件和流 打开文件void open (const char *filename, io...

  • Redis源码涉及C语言

    sizeof(): 太复杂了,泪奔; void *memcpy(void *dest, const void *s...

  • C++ 碎知识点

    C++ 碎知识点 23. 不能被重载的运算符 ** sizeof **:sizeof 运算符 ** . **:成员...

  • 【C++】C++学习笔记之十八:const

    const member function const 放在成员函数名的后面,成员函数体的前面----const ...

网友评论

    本文标题:学习笔记C++(预处理、const、sizeof)

    本文链接:https://www.haomeiwen.com/subject/umdtdftx.html