【C/C++语法】Chapter 1

为了找工作,当前决定先把 JOS 学习放一放,主攻 C/C++ 语法与数据结构和算法问题。JOS 日后再战!

【c/c++语法】系列主要用于收藏一些比较经典的语法注意点。


1、函数参数的压栈顺序:http://www.360doc.com/content/13/1209/17/8285430_335754124.shtml


2、异或的巧用:

1)无进位的加法

2)两个数的差异位

3)与1异或就是取反,与0异或就是不变。


3、C/C++ 混合编程详解:How to mix C and C++(https://isocpp.org/wiki/faq/mixing-c-and-cpp)涉及 extern "C"的用法


4、宏定义 #define 的6个要点:

a.#define 替换的文本可以是任意的;
b.#define 不能以分号结束 ;
c.熟练三目判别运算符
d.表达式用括号包裹起来更安全;
e.意识到表达式将使一个16位机的整型数溢出,因此要用长整型符号L,告诉编译器这个常数是长整型数;
f. 宏调用直接将替换文本插入代码中,形式参数的每次出现都将被替换成对应的实际参数,缺陷在于含有自增/自减、输入输出运算符则可能出现不对


5、构造析构函数执行顺序http://gaocegege.com/Blog/cpp/cppclass(高策)


6、字节对齐(有效对齐值):


先来看四个重要的基本概念:

     1) 数据类型自身的对齐值:char型数据自身对齐值为1字节,short型数据为2字节,int/float型为4字节,double型为8字节。

     2) 结构体或类的自身对齐值:其成员中自身对齐值最大的那个值(如果结构体内存在长度大于处理器位数的元素,就以处理器位数对齐,
感觉这句话适用于Linux,而不适用于Windows

     3) 指定对齐值:#pragma pack (value)时的指定对齐值value。


默认的对齐格式,也就是:#pragma pack()

情况下,会在结构体中挑选占用字节最多的类型,例如double 占用8个字节,例子:

#pragma pack()

struct A
{
    char c;

    char c1;

    int a;

    double d;

};

上面的结构体长度是16.也即在没有指定对齐值时,可以忽略其影响。


     4) 数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小者,即有效对齐值=min{自身对齐值,当前指定的pack值}。


其中,有效对齐值N是最终用来决定数据存放地址方式的值。有效对齐N表示“对齐在N上”,即该数据的“存放起始地址%N=0”。而数据结构中的数据变量都是按定义的先后顺序存放。第一个数据变量的起始地址就是数据结构的起始地址。结构体的成员变量要对齐存放,结构体本身也要根据自身的有效对齐值圆整(即结构体成员变量占用总长度为结构体有效对齐值的整数倍)。

注意注意注意:Linux下的GCC与Windows下的VC不同,Linux的GCC编译器下最高为4字节对齐(32位机器的原因?)。

例如:

typedef struct 

char c:2; 
double i; 
int c2:4; 
}N3;

在GCC下占据的空间为16字节,在VC下占据的空间应该是24个字节。

这里再给几个栗子:

struct A 

int a; 
char b; 
short c; 
}; 
struct B 

char b; 
int a; 
short c; 
}; 
struct C 

double t; 
char b; 
int a; 
short c; 
}; 
struct D 

char b; 
double t; 
int a; 
short c; 
};


在VC中,SIZEOF这四个结构体,分别为:8、12、24、24;

详见:http://www.cnblogs.com/clover-toeic/p/3853132.html(主要看3.1.2节)

http://www.cnblogs.com/alfredzzj/archive/2012/06/17/2552431.html



7、关于C++的学习,C++ primer 这本书有的地方讲得太细,可以C语言中文网快速学习。


8、指针问题。

int   *p[4]; 	    //指针数组。        			  (数组的每个元素都是指针) 
int   (*p)[4];       //数组指针。它是一个指针,指向有4个整型元素的数组。   (一个指针指向有4个整型元素的数组,相当于二维指针) 
int *func(void);     //指针函数。无参函数, 返回整型指针。         (函数的返回值为int*) 
int (*func)(void);   //函数指针。可以指向无参, 且返回值为整型指针的函数。 (函数的返回值为int)



9、C++内存管理

见这篇文章:http://chenqx.github.io/2014/09/25/Cpp-Memory-Management/(ShinChan)



你可能感兴趣的:(【C/C++语法】Chapter 1)