本文是C和C++一些小tips,一部分(比如1)是语言的重要细节,这部分可以快速的浏览,对自己的知识查漏补缺;而另一部分(2-6)则是一些编程技巧,这些技巧似乎并不是那么实用,但是却相当有趣,各位看官在时间充裕的情况下可以自己思考一下实现的方法,如对笔者的方法有疑问,或者有更好的方法,欢迎大家提出和交流。
printf(“%%”)可以用来输出%
变量交换(交换a和b中的值)
经典三变量
t = a; a = b; b = t;
不借助额外变量的方法
//法1 a = a + b; //运行结束后:a:a+b, b:b b = a - b; //a:a+b, b:a a = a - b; //a:b, b:a //法2,^为异或 a = a ^ b; b = a ^ b; a = a ^ b;
int的范围问题
int i = 0; while (i < i + 1) i++;
当while结束后i就是int的最大值,i+1就是int的最小值
double的精度问题
double x = 0.1; for (int i = 0; i < 30; i++, x *= 0.1) printf("%.30lf\n", x);
在VS2013 中通过观察可以知道double的精度最多为16位(有效数字)
通过查资料可知double的精度为15-16位,能保证有15位
float的精度为6-7位,能保证有6位double范围问题
//如果观察不出结果,y可以设置得更大 int y = 1030; //double的精度为15-16位,为了让double足够大,应尽量取高精度,因为笔者的编译器在取17个9的时候x变为了1.00000000000....所以这里取16位 for (double x = 0.9999999999999999; y--; x *= 2) printf("%.16e\n", x); y = 1030; for (double x = -0.9999999999999999; y--; x *= 2) printf("%.16e\n", x);
生成可执行文件后,命令行启动,输出重定向到文本中((假设名为POJ.exe)
观察输出
Line 1023-1030
Line 2053- 2060
可以得到double能表示的最大整数和最小整数(非精确)分别为:
1.7976931348623157e+308和-1.7976931348623157e+308
又查资料可知在(WIN8-VS2013)c:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\float.h 中可以得到关于double的更多信息:
宏DBL_MAX即为double能表示的最大值,除了最后一个数字,其他与实验得到的数据均相同,但这是可以理解和接受的,因为double的精度只有15-16位,而这里的最后一位,已经是第17位有效数字&&与||的优先级
cout << (false && false || true) << endl; cout << (true || false && false) << endl; cout << ((true || false) && false) << endl;
由以上实验和资料(The C Programming Language)可知&&优先级大于||