kk Blog —— 通用基础

date [-d @int|str] [+%s|"+%F %T"]

c/c++函数扩展名

  • 后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;
  • 后缀为.cpp的,两者都会认为是c++程序
1
2
3
4
5
6
int printf(char*, ...);
int main()
{
	printf("test\n");
	return 0;
}
一、

保存为.c 文件, 用gcc编译能通过,g++编译不能通过。
g++会判定是不是你自己声明的函数,如果是,它会按照一种规则去重命名该函数。c++为了支持重载才这么做,而c没有重载。

二、

保存为.cpp文件,用gcc、g++都编译不能通过

上下文无关文法

上下文无关文法有足够的能力描述现今程序设计语言的语法结构,比如描述算术表达式,描述各种语句等。

1.上下文无关文法语法树

给定文法G=(VN,VT,P,S),对于G的任何句型都能构造与之关联的语法树(推导树)。这棵树满足下列4个条件:
① 每个结点都有一个标记,此标记是V的 一个符号。
② 根的标记是S。
③ 若一结点标记A,至少有一个从它出发的分枝,则A肯定在VN中
④ 如果标记为A,有n个从它出发的分枝,并且这些分枝的结点的标记(从左到右)为B1, B2,…,Bn,那么A→B1B2,…,Bn一定是P中的一个产生式。
例:

1
2
3
4
5
6
G[S]:
S→aAS
A→SbA
A→SS
S→a
A→ba

写出aabbaa句型的推导过程:

1
2
(1)S=>aAS=>aAa=>aSbAa=>aSbbaa=>aabbaa(最右推导)
(2)S=>aAS=>aSbAS=>aabAS=>aabbaS=>aabbaa(最左推导)

2.句型、推导

1
2
3
G[E]: E→E+T|T
T→T*F|F
F→(E)|a

判断a+a*a是否是合法的句子,采用最左推导和最右推导

1
2
E=>E+T=>T+T=>F+T=>a+T=>a+T*F=>a+F*F=>a+a*F=>a+a*a(最左推导)
E=>E+T=>E+T*F=>E+T*a=>E+F*a =>E+a*a=>T+a*a=>F+a*a=>a+a*a(最右推导)

3.规范推导、规范句型

最左(最右)推导:在推导的任何一步αTβ,其中α、β是句型,都是对α中的最左(右)非终结符进行替换。最右推导被称为规范推导。

由规范推导所得的句型称为规范句型。任何句子都有规范推导,但句型不一定有规范推导。
例:设语言L1={n|n是无符号整数}且文法G: N =>ND N =>D
D =>0|1|2|3|……|9
对于该文法,3D是句型,但不存在规范句型。
而33是存在规范句型。
N=>ND=>DD=>3D (不是最右推导)
N=>ND=>N3=>D3=>33 (是最右推导)

4.构造语法树

1
2
3
4
G[E]:
E→E+T|T
T→T*F|F
F→(E)|a

画出a+a*a句型的语法树

一棵语法树表示了一个句型的可能的不同推导过程,包括最左(最右)推导。但是,一个句型是否只对应唯一的一棵语法树呢?一个句型是否只有唯一的一个最左(最右)推导呢?
例:

1
2
3
4
5
G[E]
E->i
E->E+E
E->E*E
E->(E)

句型i*i+i两个不同的最左推导

1
2
E=>E+E=>E*E+E=>i*E+E=>i*i+E=>i*i+i
E=>E*E=>i*E=>i*E+E=>i*i+E=>i*i+i

5.二义文法

若一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的或者,若一个文法存在某个句子有两个不同的最左(右)推导,则称这个文法是二义的。
对于一个程序设计语言来说,常常希望它的文法是无二义的,因为希望对它的每个语句的分析是唯一的。
二义文法改造为无二义文法

1
2
3
4
G[E]:    E → i             G[E]: E → T|E+T
      E → E+E                       T → F|T*F
      E → E*E                       F → (E)|i
      E → (E)               规定优先顺序和结合律 

ssh利用RSA公钥远程登录验证

1、本地机器生成密钥
1
$ssh-keygen -t rsa

生成基于ssh协议第二版密钥,如果还是用rsa1,该升级了。

2、复制生成的id_rsa.pub公钥文件到远程服务器,简单的用:
1
$scp id_rsa.pub bsduser@192.168.1.188:mykey.pub
3、密码登陆远程服务器:
1
$ssh 192.168.1.188 -l bsduser

这里注意不是cp,而是cat;不是">“,而是”>>“的操作:

1
%cat mykey.pub >> $HOME/.ssh/authorized_keys
4、重启sshd
1
#/etc/rc.d/sshd restart
5、此时进行登录测试:
1
$ssh bsduser@192.168.1.188

成功,则可以不用输入繁琐和易泄露的密码。但是条件是你要保护好自己的密钥文件信息。

  • 注意authorized_keys文件权限设置600

  • 服务器上若对用户主目录进行了软链接,则软链接的目录权限要小等于755。如 ln -s /opt/kk /home/kk, 则需要chmod 755 /opt/kk,不然会不起作用。

tar命令

tar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件
这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。
-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出
-C:输出到指定目录
-f: 使用档案名字

下面的参数-f是必须的
-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。
# tar -cf all.tar *.jpg 
这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。 
# tar -rf all.tar *.gif 
这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。 
# tar -uf all.tar logo.gif 
这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。 
# tar -tf all.tar 
这条命令是列出all.tar包中所有文件,-t是列出文件的意思 
# tar -xf all.tar 
这条命令是解出all.tar包中所有文件,-x是解开的意思 

解压

1
2
3
4
5
6
tar –xvf file.tar //解压 tar包
tar -xzvf file.tar.gz //解压tar.gz
tar -xjvf file.tar.bz2   //解压 tar.bz2
tar –xZvf file.tar.Z   //解压tar.Z
unrar e file.rar //解压rar
unzip file.zip //解压zip

总结

1
2
3
4
5
6
7
8
9
1、*.tar 用 tar –xvf 解压
2、*.gz 用 gzip -d或者gunzip 解压
3、*.tar.gz和*.tgz 用 tar –xzf 解压
4、*.bz2 用 bzip2 -d或者用bunzip2 解压
5、*.tar.bz2用tar –xjf 解压
6、*.Z 用 uncompress 解压
7、*.tar.Z 用tar –xZf 解压
8、*.rar 用 unrar e解压
9、*.zip 用 unzip 解压

只打包打包内核源码

1
tar cvzf kernel-2.6.32-358.6.1.el6.ws.b.5.2.8.tar.gz kernel-2.6.32-358.6.1.el6.ws.b.5.2.8 --exclude-from=exfile

其中exfile内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
*.o
*.o.*
*.a
*.ko
*.ko.*
*.cmd
*.ko.unsigned
*.ko.digest
*.ko.digest.sig
*.tmp*

*.so
*.so.dbg
*.mod.c
*.i
*.lst
*.symtypes
*.order
*.elf
*.bin
*.tar
*.gz
*.bz2
*.lzma
*.xz
*.lz4
*.lzo
*.patch
*.gcno
modules.builtin
Module.symvers
*.dwo

*.svn
*/vmlinux
*/vmlinux.o
*/tags

# cscope files
cscope.*
ncscope.*

*.orig
*~
\#*#

C语言运算符优先级

一共有十五个优先级:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1   ()  []  .  ->
2   !  ~  ++  --  -(负号)  &(取变量地址)  *(指针取值)   (type)(强制类型转换)  sizeof 
3   * / %
4   + - 
5   >> <<  
6   > >= < <= 
7   == !=   
8   &  
9   ^   
10  |   
11  &&
12  ||
13  ?:
14   =  +=  -=  *=  /=   %=  |=   ^=   &=   >>=   <<=
15  ,
就着多吧   结合性:2   13  14  是从右至左   其他都是  从左至右