28=256
210=1024
216=65536(32768)
C语言int的取值范围在32/64位系统中都是32位,范围为-2147483648+2147483647,无符号情况下表示为04294967295。共有10位
在堆外定义的变量都会初始化为0的,不管是单个变量还是数组
INT_MIN和INT_MAX分别表示有符号基本整型的最小值和最大值
随便写几个输出格式记着:%.3lf,%03d,%6d
普通计算机完成一万次循环不到0.1秒
枚举类型enum的元素长度根据编译器而定。在visual c++下,它和int一样长,是4个字节,在GCC下它会取尽可能短的长度,例如你这个枚举类型只有3种标识,那么它是一个字节
进制转换只有两种情况:十进制转换为其他进制(用这个十进制数除以所求进制取余数即可),其他进制转换为十进制(此进制数拆成数字乘以进制对应的幂次方即可)。
二进制是0b开头,八进制是0什么什么,十六进制是0x什么什么,如果在int前面加上0,那么就不再是十进制的,天
12的平方是int在GCC中的极限平方了,到了13的平方就会溢出,int型数组建立20万个没事,建立100万个就创建不出了,因此在数组建立不出来时,尽量让数组放在函数之外,因为如果数组太大,放在函数内有可能会崩溃,在函数之外则不会有这样的问题。因为在函数外定义属于全局变量,全局变量在静态存储区分配内存,而局部变量是在栈上分配内存空间的,如果数组太大,可能会造成栈溢出。
创建链表的时候,一定要给最后设置NULL,不然是会乱指的
在C++中,如果创建一个结构体指针不设NULL,同样会乱指
c语言不会用&作为函数参数,但C++可以,代表地址,也就是说,可以完全相当于*,但是,如果是直接的常量,写死在内存上,那么就会报错,而*则不会出现这种问题,说白了就是一种自带注释的写法,但关键是,&更方便,代码更易懂
在输入指针参数时,如果只是输入一个参数指针,则也会按照值传递来算,也就是说,只会把指针的值传进去,真恶心
另外,要注意内存泄漏了,多使用del或者free函数,两者适用于不同的场合
编译器隐式执行的任何类型转换都可以由static_cast来完成,比如int与float、double与char、enum与int之间的转换等。当编译器隐式执行类型转换时,大多数的编译器都会给出一个警告,使用static_cast可以明确告诉编译器,这种损失精度的转换是在知情的情况下进行的,也可以让阅读程序的其他程序员明确你转换的目的而不是由于疏忽。
用法:使用static_cast可以找回存放在void指针中的值。一般用于malloc,它的返回值正是void,这叫自带解释。。
double * dptr = static_cast(vptr);
C11增加了一些新特性,and,or,not 何以取代&& || !真方便!
指针从本质上讲是一个变量,变量的值是另一个变量的地址,指针在逻辑上是独立的,它可以被改变的,包括指针变量的值(所指向的地址)和指针变量的值对应的内存中的数据(所指向地址中所存放的数据)。
引用从本质上讲是一个别名,是另一个变量的同义词,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化(先有这个变量,这个实物,这个实物才能有别名),而且其引用的对象在其整个生命周期中不能被改变,即自始至终只能依附于同一个变量(初始化的时候代表的是谁的别名,就一直是谁的别名,不能变)。引用在定义时需要加上&,而在使用时不用加&
用assert启用断言,一般是对预计可能出现的错误函数参数或者溢出变量进行判断,需要时添加#include
for(expression : struct) 完全也可以用普通数组这个语法糖,但是指针就不行,而且是值传递的,也就是不能修改
在C++中,结构体可以直接相等赋值(里面没有指针),这个叫浅拷贝,如果有指针的话,可以预见,它们将使用同一地址,如果要拷贝,就应该开辟新的地址,放入新的数据,封装在单独的函数中执行即可
struct MyStruct t1 = {1, 2, “hello”};可以这样算
这里有一个值得注意的一点是,如果一个数组是堆分配的,那么它会自动初始化为0,如果是栈分配的,那么它是随机分配,没有初始化这么一个过程,在C语言还是在c++中都是这样
早在C++98标准中就存在了auto关键字,那时的auto用于声明变量为自动变量,自动变量意为拥有自动的生命期,这是多余的,因为就算不使用auto声明,变量依旧拥有自动的生命期,C++98中的auto多余且极少使用,C++11已经删除了这一用法,取而代之的是全新的auto:变量的自动类型推断。auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型
auto默认是by-value方式
C++的struct可以放入函数,但是C语言的不行
1.C++有一个标准模板库STC,里面有各种数据结构
map的值是按照key升序排列的,也就是说,自动排列
通过map对象的方法获取的iterator数据类型是一个std::pair对象。iterator包括两个数据 iterator->first 和 iterator->second 分别代表关键字key和存储的数据value。
宏定义迭代器是一种检查容器内元素并遍历元素的数据类型。C++更趋向于使用迭代器而不是下标操作,因为标准库为每一种标准容器(如vector)定义了一种迭代器类型,而只用少数容器(如vector)支持下标操作访问容器元素。
宏常量没有数据类型,没有类型安全检查,不分配内存,并在字符串替换时可能会产生意想不到的错误,字符串中永远不包含宏,否则该宏名当字符串处理,宏定义末尾不必加分号,否则连分号一并替换,宏定义可以嵌套,可用#undef命令终止宏定义的作用域
2.带参数的宏定义实例:
#define INC(x) x+1
y = INC(5);
反例:
#define SQ® r*r
area = SQ(a+b);//就会变成a+b*a+b,所以最好所有层次都要带上括号
文件包含 #include
条件编译 #ifdef
3.在C语言的宏里,#的功能是将后面的宏参数进行字符串化操作
__LINE__表示是在多少行
__FILE__表示这个是在哪个源文件里的
__DATE__表示源文件被翻译到代码时的日期
__TIME__源代码翻译到目标代码的事件
只包含空格的行,被称为空白行,可能带有注释,C++ 编译器会完全忽略它。
4.此外,我们还可以使用 #if 0 … #endif 来实现注释,且可以实现嵌套,格式为:
#if 0
code
#endif
你可以把 #if 0 改成 #if 1 来执行 code 的代码。
这种形式对程序调试也可以帮助,测试时使用 #if 1 来执行测试代码,发布后使用 #if 0来屏蔽测试代码。
在codeblocks环境中启动程序不会使用在debug文件夹下的文件,若输出文件什么也没有输出,或者没有return 0的,证明程序没有运行完就强行关闭了。
5.scanf 函数的返回值反映的是按照指定的格式符正确读入的数据的个数。也就是说,可以运用while(scanf(“%d”,&x)==1){}来更加简化没有确定数据个数时的代码段,那么,这里只能输入字母来结束输入,在scanf中,回车,空格,tab键是无关紧要的,也就是输入多少也不会管,只有按下空格,再按Ctrl+z,然后再按回车,才算结束输入,这时候scanf接受的是第一个空格之前的字符,在Linux中,按下回车,再按下Ctrl+D即可结束输入,也就是说,scanf的这种特性基本没用,只有在ACM中有用。另外printf的添加空格功能也是非常重要的一个功能,格式为%3d
scanf的返回值用在什么地方呢?用在没有给出有多少数据,一次性输入完就算的那种,这么写:
while(scanf("%d %d",&m,&n)!=EOF){}
感觉还很方便
scanf函数输入字符串的的情况下空白字符(空格,回车,Tab)都只是被视为分隔符,当我们输入字符串jj后按回车的时候就会把jj连同换行符送入缓冲区,然而scanf只会接收字符串jj,并把这个字符串送入到以a为首地址的地址空间中,同时在字符串后面自动加上一个\0,那么如今缓冲区内就只有一个换行符了。如果gets()函数时,因为缓冲区内非空,那么gets直接回读取缓冲区中的换行符复制到str为首地址的内存空间,同时在字符串后面自动加上一个\0,所以输出的str的结果就是一个换行罢了。
gets只接受换行符或EOF作为分割,如果缓冲区不为空,会把换行符读进去,并把换行符改成NULL,如果缓冲区为空,则在换行符之后加上一个NULL ,而不是把换行符改成NULL
getchar()会接收缓冲区中的而第一个字符,如果缓冲区是空的,那么程序便会停在gets()位置处的等待输入。
无缓冲输入getch()
getchar与getc用法略有不同,都使用返回值,不同的是getc需要指定文件参数
windows中在conio.h
8.输入输出重定向
freopen(“d:\data_in.txt”,“r”,stdin); 将输入定向为文件d盘下的文件data_in.txt文件
freopen(“d:\data_out.txt”,“w”,stdout); 将输出定向到d盘下的data_out.txt目录。如果进行了输入输出重定向的话,那么scanf就应该添加\n了,如果后面没有\n的话,说实在的,它也应该不会出错的,到不是数字的时候自动停止,应该不会出错的。也就是说,即便后面是什么鬼都没关系,就这样,更方便了呢
9.ifstream fin(“wormhole.in”);
fin >> N;
fin.close();
ofstream fout(“wormhole.out”);
fout << solve() << “\n”;
fout.close();
就是这么用,别忘了关闭就行了
cin>>a>>b;