Configure JDK
Decompression JDK to
1 | /usr/lib/jvm |
See if there is other optional Java
1 | sudo update-alternatives --list java |
Configure environment varible:
1 | sudo gedit ~/.bashrc |
Success or Fail
1 | java -version |
Idle About
No results found
1 | /usr/lib/jvm |
1 | sudo update-alternatives --list java |
1 | sudo gedit ~/.bashrc |
1 | java -version |
1.1
2
3C++ 11
std::to_string() 要 g++ -std=c++11
g++ -std=c++11 -w file.cpp -o file 使用c++11标准,并且忽略所有警告
2.1
有人也许以为i++或者++i的效率比拆开之后要高,这只是一种错觉。这些代码经过基本的编译器优化之后,生成的机器代码是完全没有区别的。自增减表达式只有在两种情况下才可以安全的使用。一种是在for循环的update部分,比如for(int i = 0; i < 5; i++)。另一种情况是写成单独的一行,比如i++;。这两种情况是完全没有歧义的。你需要避免其它的情况,比如用在复杂的表达式里面,比如foo(i++),foo(++i) + foo(i),…… 没有人应该知道,或者去追究这些是什么意思。
3.1
有人可能会说,全都打上花括号,只有一句话也打上,多碍眼啊?然而经过实行这种编码规范几年之后,我并没有发现这种写法更加碍眼,反而由于花括号的存在,使得代码界限明确,让我的眼睛负担更小了。
4.1
2
3
4
5
6
7避免使用continue和break。循环语句(for,while)里面出现return是没问题的,然而如果你使用了continue或者break,就会让循环的逻辑和终止条件变得复杂,难以确保正确。
出现continue或者break的原因,往往是对循环的逻辑没有想清楚。如果你考虑周全了,应该是几乎不需要continue或者break的。如果你的循环里出现了continue或者break,你就应该考虑改写这个循环。改写循环的办法有多种:
如果出现了continue,你往往只需要把continue的条件反向,就可以消除continue。
如果出现了break,你往往可以把break的条件,合并到循环头部的终止条件里,从而去掉break。
有时候你可以把break替换成return,从而去掉break。
如果以上都失败了,你也许可以把循环里面复杂的部分提取出来,做成函数调用,之后continue或者break就可以去掉了。
5.1
如果你把异常catch了,忽略掉,那么你就不知道foo其实失败了。这就像开车时看到路口写着“前方施工,道路关闭”,还继续往前开。这当然迟早会出问题,因为你根本不知道自己在干什么。catch异常的时候,你不应该使用Exception这么宽泛的类型。你应该正好catch可能发生的那种异常A。使用宽泛的异常类型有很大的问题,因为它会不经意的catch住另外的异常(比如B)。你的代码逻辑是基于判断A是否出现,可你却catch所有的异常(Exception类),所以当其它的异常B出现的时候,你的代码就会出现莫名其妙的问题,因为你以为A出现了,而其实它没有。这种bug,有时候甚至使用debugger都难以发现。
6.1
2
3
4
5
6
7不要把null放进“容器数据结构”里面。所谓容器(collection),是指一些对象以某种方式集合在一起,所以null不应该被放进Array,List,Set等结构,不应该出现在Map的key或者value里面。把null放进容器里面,是一些莫名其妙错误的来源。因为对象在容器里的位置一般是动态决定的,所以一旦null从某个入口跑进去了,你就很难再搞明白它去了哪里,你就得被迫在所有从这个容器里取值的位置检查null。你也很难知道到底是谁把它放进去的,代码多了就导致调试极其困难。
解决方案是:如果你真要表示“没有”,那你就干脆不要把它放进去(Array,List,Set没有元素,Map根本没那个entry),或者你可以指定一个特殊的,真正合法的对象,用来表示“没有”。
```
7.
```C++
char num[128];
cin >> setw(127) >> ... 限定输入字符数
8.1
2inline本身还是有另外一个意义:
一个可执行文件的cpp文件中一个函数只能被定义一次。如果你把函数定义在一个.h文件中并让两个cpp包含就会造成这个函数分别在两个cpp中被定义产生错误。但是inline函数是允许在多个cpp中多次定义的,就解决了这个问题。
1 | scanf( "%[^\n]", str ); 回车才返回 |
底层是指针实现
a[5] == 5[a];
“ABCD”[2] == 2[“ABCD”] == ‘C’;
相当于(a + 5) == (5 + a)
1 | #include <stdio.h> |
result:4 and 5, 因为 sizeof 是编译时行为,运行时不会执行
#pragma once是编译器相关的,有的编译器支持,有的编译器不支持,具体情况请查看编译器API文档,不过现在大部分编译器都有这个杂注了。#ifndef,#define,#endif是C/C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式。
下划线是变量
(, );
__[];
__=&__;
gcc的C扩展支持嵌套函数(函数里可以再定义函数). clang的C好像还有闭包..
http://www.anwcl.com/wordpress/c%E8%AF%AD%E8%A8%80%E7%9A%84tricks%E4%B8%8E%E6%9C%AA%E5%AE%9A%E4%B9%89%E8%A1%8C%E4%B8%BA-undefined-behavior/
1 | #include <stdio.h> |
1 | 来自Linux Kernel的例子,一般用得比较少 |
匿名数据结构:匿名数组、匿名结构体等。实现Lisp的List
1 | int main() { |
C++1x 可以用 auto 来省略类型声明, 而 C 的 auto 关键字意思完全不同但明显是个废话(auto 的意思是非 static, 和不写一样), 还好有 C 有 typeof
异或实现双链表
https://en.wikipedia.org/wiki/XOR_linked_list
duff‘s device
https://en.wikipedia.org/wiki/Duff%27s_device
trigraph
http://blog.sina.com.cn/s/blog_4b687eac01008ice.html
##ubuntu挂起后不能唤醒解决
1 | ##安装pm-utils |
1 | sudo apt-get install wmctrl |
1 |
|