您的位置:首页 > 其它

[算法竞赛入门经典(第2版)读书笔记] ,第一章

2015-04-20 14:28 232 查看
本文是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)可知&&优先级大于||
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: