如果我还从C语言写 Hello World 写起,我估计你会疯掉。总不能所有的都要来一遍叭,所以这篇文章的顺序不会按教科书的形式来讲,而是站在前端程序员与JavaScript语言和C语言对比的角度来讲。
先从数组说起。
数组
连续空间
我们知道数组在内存里是连续的空间,但是我们如何知道它是连续的呢?
例如下面这个例子:
const arr = [1,2,3]
我们如何知道在内存中 arr[0]
和 arr[1]
的地址是相连的呢?
我们可以C语言来看:
#include <stdio.h>
int main(int argc, char const *argv[])
{
int arr[] = {
1,2,3};
printf("%p\n",&arr[0] ); # 0x7ffeee3d697c
printf("%p\n",&arr[1] ); # 0x7ffeee3d6980
}
注:&
是C语言里面取地址的操作符。
我们看到地址是以十六进制的形式打印出来的,数组 arr
里的第0个元素和第一个元素之间相差了 4
个字节,那么是不是所有的间隔都是相差 4 个字节呢?我们来看下。
int main(int argc, char const *argv[])
{
int arr[] = {
1,2,3};
printf("%p\n",&arr[0] ); # 0x7ffee120497c
printf("%p\n",&arr[1] ); # 0x7ffee1204980
printf("%p\n",&arr[2] ); # 0x7ffee1204984
printf("%p\n",&arr[3] ); # 0x7ffee1204988
}
我们看到结果是显然的,这说明数组在内存中是占据连续空间的。数组中的元素是按顺序进行排列的。
这有什么用吗?似乎不影响我们搬砖🧱 ,但是我相信你理解,从C的角度看待我们从js看不到的现象是有用的。
在javascript中,数组内可以放入任意类型的元素:
const arr = [1,'2',{
'a':'b'}];
而在C语言中是不支持在数组中放入不同类型元素的,在C语言中对于数组的定义是具有相同类型
的一组元素,在定义数组时我们首先要在前面规定数组中的元素类型:
char arr = {
"1" , "2"};
二维数组
二维数组可以看成一个矩阵,从矩阵角度看待矩阵,我们就可以做很多的事情了,除了搬砖,我们可以用矩阵做科学计算,如果你了解R语言的话,就知道这是多么的常用了。
例如 a[3][5]
,可以表示一个三行五列的矩阵。
那么二维数组应该如何定义呢?
int arr[][3] = {
{
1,2,3},
{
4,5,6},
{
7,8,9},
};
行数可以不用指定,C语言的编译器会自动计算,但是列比较指定。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int arr[][3] = {
{
1,2,3},
{
4,5,6},
{
7,8,9},
};
printf("%d\n", arr[0][1]); # 2
}
字符串
字符串与数字
我们知道其实在计算机内部,字母也是用数字来表示的,不过这如何在C语言中体现呢?
#include <stdio.h>
int main()
{
/* code */
char a = 49;
char b = '1';
if(a == b){
printf("相等\n");
}else{
printf("不相等\n");
}
return 0;
}
我们发现上述的结果是相等,这很奇怪,如果是在javascript中,这是不可能的。
Object.is(49,'1'); // false
结果明显会是false。但是我们可以通过字符串的 charCodeAt()
方法,得到字母所对应的ASCII码,我们将字符串 1
转换成数字再和 49
来对比一下:
Object.is('1'.charCodeAt() ,49) // true
我们发现结果其实是相等的,一点都不惊讶这种差异,因为只是C语言体现的更直接,而javascript为我们进行了封装。
但其实在C语言中,我们把字符 1
以整数形式和以字符的形式输出,得到的结果是不同的:
#include <stdio.h>
int main()
{
/* code */
char a = '1';
printf("%d\n", a); // 49
printf("%c\n", a); // 1
return 0;
}
其实和javascript是可以对应的,以数字输出时就是数字 1
,而以字符输出时是 49
。
字符串计算
#include <stdio.h>
int main()
{
/* code */
char a = 'a';
char b = a + 1;
printf("%c\n", b); // b
}
大写字母转小写字母:
#include <stdio.h>
int main()
{
/* 大写字母与对应小写字母之间的距离 */
int distance = 'a' - 'A'