C++Primer Plus (第六版)阅读笔记 + 源码分析【第三章:处理数据】
- 第三章:处理数据
- 简单变量
- 整型
- 整型 short 、int 、long 和 long
- 无符号类型
- 选择整型类型
- 整型字面值
- C++如何确定常量的类型
- char 类型:字符和小整型
- bool类型
- cosnt 限定符
- 浮点数
- 书写浮点数
- 浮点数类型
- 浮点常量
- 浮点数的优缺点
- C++算术运算符
- 运算符优先级和结合性
- 除法分支
- 求模运算符
- 类型转换
- 初始化和赋值进行转换
- 以 { } 方式初始化时进行的转换(C++11)
- 表达式中的转换
- 整型提升
- 不同类型进行算术运算
- C++11校验表
- 传参时转换
- 强制类型转换
- C++11中的 auto
- 总结 C++基本类型
- 整型
- 浮点数
第三章:处理数据
面向对象的本质是设计并扩展自己的数据类型。
C++内置类型:
- 基本类型。
- 复合类型。
简单变量
信息存储在计算机中需要记录三个基本属性:
- 存储的位置。
- 存储的值。
- 存储的类型。
变量的命名规范:
- 数字、字母、下划线组成。
- 不以数字开头。
- 区分大小写。
- 不能使用关键字。
命名方案:
- 整型变量名前加 n
- 字符串前面加 str
- 布尔值前面加 b
- 指针前面加 p
- 单个字符前面加 c
- 类成员值前面 m_
整型
char、short、int、long和C++11新增 long long 每种类型都有符号版本和无符号版本共计10种类型。
整型 short 、int 、long 和 long
C++提供灵活标准:
- short 至少16位。
- int 至少和 short一样长。
- long 至少32位,且至少和 int 一样长。
- long long 至少64位,且至少和 long 一样长。
short 是 short int 简称。
long 是 long int 简称。
程序清单3.1 limits.cpp
代码演示:
#include <iostream>
#include <climits>int main()
{using std::cin;using std::cout;using std::endl;int n_int = INT_MAX;short n_short = SHRT_MAX;long n_long = LONG_MAX;long long n_llong = LLONG_MAX;cout << "int is " << sizeof(int) << " bytes." << endl;cout << "short is " << sizeof(short) << " bytes." << endl;cout << "long is " << sizeof(long) << " bytes." << endl;cout << "long long is " << sizeof(long long) << " bytes." << endl;cout << "Maximum values:" << endl;cout << "int: " << n_int << endl;cout << "short: " << n_short << endl;cout << "long: " << n_long << endl;cout << "long long: " << n_llong << endl << endl;cout << "Maximum int value = " << INT_MAX << endl;cout << "Bits per byte = " << CHAR_BIT << endl;return 0;
}
运行结果:
C++编译过程中,现将源代码传递给预处理器,预处理完成替换之后被编译。
预处理器只查找独立的标记,跳过嵌入的标记。
初始化:将赋值和声明合并。
如果不对函数内部的变量进行初始化,则改变量的值是不确定的。
在声明变量时进行初始化,避免忘记赋值的情况发生。
C++11 使得可以将大括号初始化器用于任何类型,这是一种通用的初始化语法。
无符号类型
优点:增大变量能够存储的最大值。
使用关键字 usigned 修饰。
unsigned 本身是 unsigned int 的缩写。
程序清单3.2 exceed.cpp
代码演示:
#include <iostream>
#include <climits>#define ZERO 0int main()
{using std::cin;using std::cout;using std::endl;short sam = SHRT_MAX;unsigned short sue = sam;cout << "Sam has " << sam << "dollars and Sue has " << sue << "dollars deposited." << endl;cout << "Add $1 to each account." << endl << "Now ";sam = sam + 1;sue = sue + 1;cout << "Sam has " << sam << " dollars and Sue has " << sue << " dollars deposited.\nPoor Sam!" << endl;sam = ZERO;sue = ZERO;cout << "Sam has " << sam << " dollars and Sue has " << sue << " dollars deposited." << endl;cout << "Take $1 from each account." << endl << "Now";sam = sam - 1;sue = sue - 1;cout << "Sam has " << sam << " dollars and Sue has " << sue << " dollars deposited." << endl;cout << "Lucky Sue!" << endl;return 0;
}
运行结果:
C++不保证符号整型超过限制是不出错。
选择整型类型
int 被设置为对目标计算机而言的自然长度。
自然长度:计算机处理起来效率最高的长度。
- 如果没有非常有说服力的理由来选择其他类型,则应该使用 int。
- 如果变量的值不可能为负,则可以使用无符号类型表示更大的值。
- 如果知道变量所表示的整数值大于16位整数的最大值,则使用 long,及时系统上 int 为32位,也应该这样做。
(原因:移植到16位系统上程序可以正常工作。) - 如果要存储的值超过20亿,使用 long long。
- 使用 short 可以节省内存,当有大型数组时,才有必要使用 shrot。
- 如果只需要一个字节,可使用char。
整型字面值
- 十进制:第一位为 1 ~ 9 基数为 10。
- 八进制:第一位为 0,第二位为 1~7 基数为 8。
- 十六进制:前两位为 0x 或者 0X 基数为 16。
程序清单3.3 hexoct.cpp
代码演示:
#include <iostream>int main()
{using std::cin;using std::cout;using std::endl;int chest = 42;int waist = 0x42;int inseam = 042;cout << "Monsieur cuts a stricking figure!\n";cout << "chest = " << chest << " (42 in decimal)\n";cout << "waist = " << waist << " (0x42 in decimal)\n";cout << "inseam = " << inseam << " (042 in decimal)\n";return 0;
}
运行结果:
默认情况下 cout 以十进制显示整数,不管整数在程序中如何书写。
所有数都以相同的方式存储在计算机中:二进制数存储。
cout进制输出控制符:
- dec 十进制输出。
- hex 十六进制输出。
- oct 八进制输出。
默认格式为十进制,修改格式之前,格式一直有效。
程序清单3.4 hexoct2.cpp
代码演示:
#include <iostream>int main()
{using namespace std;int chest = 42;int waist = 42;int inseam = 42;cout << "Monsieur cuts a stricking figure!\n";cout << "chest = " << chest << " (decimal for 42)\n";cout << hex;cout << "waist = " << waist << " (hexadecimal for 42)\n";cout << oct;cout << "inseam = " << inseam << " (octal for 42)\n";return 0;
}
运行结果:
cout << hex;
等代码不会在屏幕上显示任何信息,只是修改 cout
显示整数的方式。
C++如何确定常量的类型
除非有理由存储为其他类型,否则将C++整型常量存储为 int 类型。
数字常量后面的字母用于表示类型:
- l 或 L 表示为 long 常量。
- u 或 U 表示 unsigned int 常量 。
- ul (采用任何顺序,大小写均可)表示 unsigned long 常量。
- ll 或 LL 表示 long long 常量。
- ull 、Ull、uLL 和 ULL 表示 unsigned long long 常量。
不带后缀的十进制数: 使用:int、long 或 long long 能够存储该数的最小类型。
不带后缀的十六进制数或八进制数:使用 int、unsigned int long、unsigned long 、long long 或 unsigned long long 能够能够存储该数的最小类型。
十六进制常用来表示内存地址,内存地址无符号。
char 类型:字符和小整型
char 类型:
- 比 short 更小的整型。
- 字符类型。
程序清单3.5 chartype.cpp
代码演示:
#include <iostream>int main()
{using namespace std;char ch;cout << "Enter a character: " << endl;cin >> ch;cout << "Hola! ";cout << "Thank you for the " << ch << " character." << endl;return 0;
}
运行结果:
cin 和 cout 的行为由变量类型引导。
C++对字符用单引号,字符串用双引号。
程序清单3.6 morechar.cpp
代码演示:
#include <iostream>int main()
{using namespace std;char ch = 'M';int i = ch;cout << "The ASCII code for " << ch << " is " << i << endl;cout << "Add one to the character code: " << endl;ch = ch + 1;i = ch;cout << "The ASCII code for " << ch << " is " << i << endl;cout << "Displaying char ch using cout.push(ch): ";cout.put(ch);cout.put('!');cout << endl << "Done" << endl;return 0;
}
运行结果:
C++将字符表示为整型,方便操纵。
char 字面量:将字符使用单引号括起来,表示字符的数值编码。
转义字符:
像处理常规字符一样处理转义字符。
作为字符常量时,用单引号括起来。
放在字符串中时,不要使用单引号。
换行操作:
cout<<endl;
cout<<'\n';
cout<<"\n"
可以基于字符的八进制和十六进制编码来使用转义字符。
符号适用于任何编码方式,可读性更强,应使用符号序列,不要使用数字转义序列。
程序清单3.7 bondini.cpp
代码演示:
#include <iostream>int main()
{using namespace std;cout << "\aOperation \"HyperHype\" is noew activated!\n";cout << "Enter your agent code:_________\b\b\b\b\b\b\b\b";long code;cin >> code;cout << "\aYou entered " << code << "……\n";cout << "\aCode verified! Proceed with PlanZ3!\n";return 0;
}
运行结果:
char 默认情况下既不是没有符号,也不是有符号。是否有符号由C++实现决定。
可以显示将类型设置为 signed char
或 unsigned char
。
用 char 存储标准 ASCII 字符,char有没有符号都没关系。
C++处理无法用一个8位表示的字符集:
- 如果大型字符集实现是基本字符集,编译器厂商可以将 char 定义为一个16位的字节或更长的字节。
- 同时支持一个小型基本字符集和一个较大的扩展字符集,8位char可以表示基本字符集,另一种类型 wchar_t 表示扩展字符集。
wchar_t :整数类型,有足够的空间,可以表示系统使用的最大扩展字符集。
C++新增的类型:
char16_t
:无符号,长16位,使用前缀u
表示char16_t
字符常量和字符串常量。例如:u'C'
和u"be good"
char32_t
:无符号,长32位,使用前缀U
表示char32_t
字符常量和字符串常量。例如:U'R'
和U"dirtyrat"
wchar_t
、char16_t
和 char32_t
有底层内置数据类型——一种内置整型,底层类型随系统。
bool类型
bool 变量的值可以是 true 或 false。
C++将非零解释为true,将零解释为false。
字面值 true 和 false 可以通过整型提升转换为 int 类型,true转换为 1,false转换为0。
任何数值或指针都可以被隐式转换为bool值,非零值转换为true,零转换为false。
cosnt 限定符
程序中多个地方使用同一个常量,需要修改该常量时,只需要修改一个符号定义即可。
C++处理常量的方法:使用 const 关键字来修改变量的声明和初始化。
常量被初始化之后,编译器不允许再修改该变量的值。
常见做法:将常量名称首字符大写或将整个名称大写。例如:Months,MONTHS。
在声明中对于 const 进行初始化,否则该常量的值将是不确定的,且无法修改。
const 相对于 #define 的优势:
- const 能够明确类型。
- 可以使用C++作用域规则将定义限制在特定的函数或文件中。
- 可以将 const 用于更复杂的类型。
- C++中(而不是C)可以使用 cosnt 值来声明数组长度。
浮点数
带小数部分的数字。
浮点数能够表示:
- 小数值。
- 非常大的值。
- 非常小的值。
书写浮点数
- 标准小数表示。例如:123.456
- E表示法(适合表示非常大或非常小的值)。例如:3.45E6 表示 3.45 * 10^6
E表示法规则:
- 可以使用 E 或 e。
- 指数可以是正数也可以是负数。
- 数字中间不能有空格。
浮点数类型
按照有效位数和允许的指数最小范围划分:
- float。有效位数至少32位。通常为32位。至少6位有效位。
- double。有效位数至少48位,且不少于 float。通常为64位。至少15位有效位。
- long double。有效位数至少和 double 一样多。通常为80、96 或 128位。
- 三种类型指数范围至少 -37 到 37。
ostream 方法 setf():迫使输出使用定点表示法,更好地了解精度,防止程序把较大值切换为E表示法,使程序显示到小数点后六位。
程序清单3.8 floatnum.cpp
代码演示:
#include <iostream>int main()
{using namespace std;cout.setf(ios_base::fixed,ios_base::floatfield);float tub = 10.0 / 3.0;double mint = 10.0 / 3.0;const float million = 1.0e6;cout << "tub = "<< tub << ", a million tubs = " << million * tub;cout << ",\nand ten million tubs =" << 10 * million * tub << endl;cout << "mint = " << mint << " and a million mints = " << million * mint << endl;return 0;
}
运行结果:
浮点常量
默认情况下浮点数常量都是 double 类型。
如果希望为 float 类型,使用 f 或者 F后缀。
long double 类型后缀使用 l 或 L。
浮点数的优缺点
优点:
- 可以表示正数之间的值。
- 可以表示的数值范围大很多。
缺点:浮点运算速度比正数运算慢,且精度将降低。
程序清单3.9 fltadd.cpp
代码演示:
#include <iostream>int main()
{using namespace std;float a = 2.34E+22f;float b = a + 1.0f;cout << "a = " << a << endl;cout << "b - a = " << b - a << endl;return 0;
}
运行结果:
分析:float 只能表示数字中的前 6位 或者前 7位,因此修改第23位对于数值不影响。
C++算术运算符
基本算术计算:
- 加法。
- 减法。
- 乘法。
- 除法。
- 求模。(求余数)
每种运算符有两个操作数。
表达式:操作数 + 运算符。
如果两个操作数是整数,则结果为商的整数部分,小数部分被丢弃。例如:17 / 3 等于 5。
求模运算:
- 例如:19 % 6 为 1。
- 两个操作数必须都是整型,将运算符用于浮点数将导致编译错误。
- 如果其中一个操作数为负数,则结果的符号满足如下规则: (a/b)*b + a%b = a。
变量和常量都可以用于操作数。
程序清单3.10 arith.cpp
代码演示:
#include <iostream>int main()
{using namespace std;float hats, heads;cout.setf(ios::fixed,ios_base::floatfield);cout << "Enter a number: ";cin >> hats;cout << "Enter another number: ";cin >> heads;cout << "hats = " << hats << "heads = " << heads << endl;cout << "hats + heads = " << hats + heads << endl;cout << "hats - heads = " << hats - heads << endl;cout << "hats * heads = " << hats * heads << endl;cout << "hats / heads = " << hats / heads << endl;return 0;
}
运行结果:
float只保证6位有效位。
如果需要更高的精度,请使用 double 或 long double。
运算符优先级和结合性
优先级:
- 算数运算符遵循先乘除,后加减。
- 可以用括号来执行自定义优先级。
- / * % 由优先级相同。
- 减和加优先级相同,但比乘除低。
结合性:
- 优先级相同时看操作数结合性。
- 乘除都是从左向右结合。
- 仅当两个运算符被用于同一个操作数时,优先级和结合性才有效。
- 例如:
int num = 20 * 5 + 24 * 6
没有指出应该先算那个乘法。C++让实现决定在系统中最佳顺序。
除法分支
如果两个操作数都是整数,则执行整数除法,结果的小数部分将被丢弃。
如果其中有一个(或两个)操作数是浮点值,则小数部分保留,结果为浮点数。
程序清单3.11 divide.cpp
代码演示:
#include <iostream>int main()
{using namespace std;cout.setf(ios::fixed,ios_base::floatfield);cout << "Integer division: 9/5 = " << 9 / 5 << endl;cout << "Floating-point division: 9.0/5.0 = " << 9.0 / 5.0 << endl;cout << "Mixed division: 9.0/5 = " << 9.0 / 5 << endl;cout << "double constants: 1e7/9.0 = " << 1e7 / 9.0 << endl;cout << "float constants: 1e7f/9.0f = " << 1e7f / 9.0f << endl;return 0;
}
运行结果:
不同类型计算时,C++把它们转换为同一类型。
如果两个操作数都是 double 类型,则结果为 double 类型。
如果两个操作数都是 float类型,则结果为 float 类型。
浮点常量默认情况下是double 类型。
运算符重载简介:
- 使用相同的符号进行多种操作。
- 根据上下文来确定运算符的含义。
- C++有内置运算符重载,支持扩展运算符重载,以便能够用于用户定义的类。
求模运算符
返回整数除法的余数。
程序清单3.12 modulus.cpp
代码演示:
#include <iostream>int main()
{using namespace std;const int Lbs_per_stn = 14;int lbs;cout << "Enter your weight in pounds:";cin >> lbs;int stone = lbs / Lbs_per_stn;int pounds = lbs % Lbs_per_stn;cout << lbs << "pounds are" << stone << " stone," << pounds << "pounds(s).\n";return 0;
}
运行结果:
类型转换
C++自动执行多种类型转换:
- 将一种算术类型的值赋给另一种算术类型的变量时,C++将对值进行转换。
- 表达式中包含不同类型时,C++将对值进行转换。
- 将参数传递给函数时,C++将对值进行转换。
初始化和赋值进行转换
C++允许将一种类型的值赋给另一种类型的变量,值将被转换为接受变量的类型。
注意:
int a = 1;
long b = 2;
b = a;
上面赋值完成后,a 的类型不变,生成和b类型相同的变量赋值给b。
潜在的数制转换问题:
赋值给 bool 变量:
- 将 0 赋值给 bool 变量时,将被转换为 false。
- 非零值将会被转换为 true。
float 值对于 int 变量来说可能太大。
程序清单 3.13 assig.cpp
代码演示:
#include <iostream>int main()
{using namespace std;cout.setf(ios::fixed,ios_base::floatfield);float tree = 3;int guess(3.9832);int debt = 7.2E12;cout << "tree = " << tree << endl;cout << "guess = " << guess << endl;cout << "debt = " << debt << endl;return 0;
}
运行结果:
注意:将浮点型转换为整型时,C++采取截断(丢失小数部分)而不是四舍五入。
以 { } 方式初始化时进行的转换(C++11)
C++使用 { } 的初始化称为列表初始化。
常用用于给复杂类型提供值列表。
类型要求更严格:列表初始化不允许缩窄。
- 不允许将浮点型转换为整型。
- 不同的整型之间或将整型转换为浮点型:编译器知道目标变量能够正确存储赋给它的值才会被允许。
表达式中的转换
同一表达式中包含两种不同的算术类型,执行两种自动转换:
整型提升
- C++将表达式中的 bool、char、unsigned char、signed char 、short 值转换为
int。(具体:true 被转换为 1, false 被转换为 0) - 通常将 int 类型选择为计算机最自然类型,计算机处理这种类型时,速度可能最快。
- 如果 short 比 int 短,unsigned short 将被转换为 int。
- 如果short 和 int 长度相同,则 unsigned short 转换为 unsigned int。
- wchar_t 被提升为下列类型中第一个宽度足够存储 wchar_t 取值范围的类型:int 、 unsigned 、 long 或 unsigned long。
不同类型进行算术运算
较小的类型将被转换为较大的类型。
C++11校验表
- 如果有一个操作数是 long double ,则将另一个操作数转换为 long double。
- 否则,如果有一个操作数是 double,则将另一个操作数转换为 double。
- 否则,如果有一个操作数是 float,则将另一个操作数转换为 float。
- 否则,说明操作数都是整型,进行整型提升。
- 整型提升,如果两个操作数都是有符号或无符号,低级别操作数类型转换为高级别操作数类型。
- 如果一个操作数有符号,另一个操作数无符号,且无符号操作数的级别比有符号操作数的级别高,则将有符号操作数转换为无符号操作数所属的类型。
- 否则,如果有符号类型可表示无符号类型的所有值,则将无符号操作数转换为有符号操作数的所属类型。
- 否则,将两个操作数都转换为有符号类型的无符号版本。
整型级别:
- 有符号整型按照级别从高到低依次为:long long 、long 、int 、short 和 signed char。
- 无符号整型的排列顺序与有符号整型相同。
- char、signed char 和 unsigned char 的级别相同。
- wchar_t 、 char_16_t 、 char32_t 的级别与其底层类型相同。
- boo 级别最低。
传参时转换
传递参数时类型转换通常由C++函数原型控制。
强制类型转换
格式:
- (long) thorn
- long (thorn)
强制类型转换不会修改 thorn 的值,而是创建一个新的、指定类型的值。
C++引入4个强制类型转换运算符。
static_cast<>
比传统前置类型转换更严格。
程序清单 3.14 typecast.cpp
代码演示:
#include <iostream>int main()
{using namespace std;int auks, bats, coots;auks = 19.00 + 11.99;bats = (int)19.00 + (int)11.99;coots = int(19.00) + int(11.99);cout << "auks = " << auks << " bats = " << bats << " coots = " << coots << endl;char ch = 'Z';cout << "The code for" << ch << "is" << int(ch) << endl;cout << "Yes, the code is " << static_cast<int>(ch) << endl;return 0;
}
运行结果:
C++11中的 auto
让编译器根据初始值类型推断变量的类型。
初始化过程中,如果使用关键字 auto 而不制定变量的类型,编译器会把变量的类型设置与初始值相同。
auto n = 100; //n int
auto x = 1.5; //x double
auto y = 1.3e12L; //y long double
处理复杂类型,如STL中的类型时,使用 auto 自动推到类型。
总结 C++基本类型
整型
- 从小到大:bool、char、signed char、unsigned char、short、unsigned short、int 、unsigned int、long 、unsigned long 、C++11新增:long long 、unsigned long long 。
- wchar_t 大小取决于实现。
- C++11 新增 :char16_t 、char32_t 、存储16位和32位字符编码。
- C++确保 char 足够大,能够存储系统基本字符集中的任何成员。
- wchar_t 能够存储系统扩展字符集中的任何成员。
- short 至少 16位,int 至少和 short 一样长,long 至少有3 2位且至少和int一样长。 确切长度取决于实现。
浮点数
- 类型:float 、double 、long double。
- C++确保:float 不超过 double,double 不会超过 long double。
- 通常 float:32位,double 64位,long double 80位 到 128位。
C++Primer Plus (第六版)阅读笔记 + 源码分析【第三章:处理数据】相关推荐
- C++Primer Plus (第六版)阅读笔记 + 源码分析【第一章:预备知识】
第一章:预备知识 C++简介 C++简史 C语言 C语言编程原理 面向对象编程 C++和泛型编程 C++的起源 可移植性和标准 程序创建的技巧 创建源代码文件 编译和链接 UNIX Linux Win ...
- C++Primer Plus (第六版)阅读笔记 + 源码分析【目录汇总】
C++Primer Plus (第六版)阅读笔记 + 源码分析[第一章:预备知识] C++Primer Plus (第六版)阅读笔记 + 源码分析[第二章:开始学习C++] C++Primer Plu ...
- C++Primer Plus (第六版)阅读笔记 + 源码分析【第四章:复合类型】
第四章:复合类型 数组 第四章:复合类型 复合类型组成: 基本整型. 浮点类型. 数组:存储多个同类型的值.(一组特殊的数组可以存储字符串.) 结构体:存储多个不同类型的值. 指针:将数据所处位置告诉 ...
- PMBOK(第六版) PMP笔记——《十一》第十一章(项目风险管理)
PMBOK(第六版) PMP笔记--<十一>第十一章(项目风险管理) 第十一章 风险管理: 项目的独特性导致项目充满风险,项目风险是一种不确定的事件或条件,可能发生.将 要发生,也可能不发 ...
- MyBatis学习笔记-源码分析篇
引言 SQL 语句的执行涉及多个组件,其中比较重要的是 Executor. StatementHandler. ParameterHandler 和 ResultSetHandler. Executo ...
- 《游戏学习》| 水果忍者HTML5网页版在线游戏 | 源码分析
游戏介绍 这是一款由百度JS小组提供的HTML5版切水果游戏,这款基于HTML5实现的网页版切水果游戏虽然和原版的切水果游戏相比仍有美中不足之处,但也算有声有色,画面效果也十分炫目华丽. 游戏截图 主 ...
- PMBOK(第六版) PMP笔记——《四》第四章(项目整合管理)
从第四章开始,进入49个过程的学习.49个过程被划分为十大知识领域,分为十个章节, 本章节是项目整合管理知识领域,主要讲述项目整合管理的7个过程. 1.需要对什么进行整合管理? 干系人需求.约束条件. ...
- Java版赤色要塞源码分析
1.框架与环境搭建 1.1 本游戏使用了以下框架 [url=http://slick.ninjacave.com/]slick2d[/url] [url=http://www.lwjgl.org/]l ...
- 《Java核心卷 I》第10版阅读笔记第八章(书第九章)
文章目录 第八章 集合 8.1 Java 集合框架 8.1.1 将集合的接口与实现分离 8.1.2 Collection 接口 8.1.3 迭代器 8.1.4 泛型实用方法 8.1.5 集合框架中的接 ...
最新文章
- 程序员,你就是三明治!
- 《基于PLL分频计数的LED灯闪烁实例》实验记录
- Linux下编写UDP/TCP版本的服务器和客户端的流程
- Ubuntu18.04 安装搜狗输入法后无法启动的问题
- css居中无效的解决办法
- python separator_在Python中使用分隔符变量拆分字符串
- 被坑的过来人告诉你,为什么数据中台永远都搞不成?
- 怎么用计算机模拟宇宙,为了弄懂宇宙的形成 科学家用电脑模拟了800万个宇宙...
- git中.ssh文件夹在哪_关于git中的https和ssh,权限等问题
- 最受程序员 欢迎的14个社区
- rust服务器消失了_【Rust日报】 20190619:Facebook的数字货币项目Libra由Rust实现
- 解决appium中Error: The port #8100 is occupied by an other process的问题
- 为什么手机玩我的世界进服务器会显示红字,LOL进去时显示的蓝红标志是什么 | 手游网游页游攻略大全...
- 第7章:OFDM 信道估计与均衡(4)
- 江理工单片机实训(自动窗帘模拟控制系统)
- 网址转换为ip(数字)地址
- 收费企业邮箱与收费个人邮箱区别,你造吗?
- 怎么在自己电脑上搭建一个服务器,以便于外网访问呢?
- 不同页签vuex同步
- 纯电动跑车中的贵族,全新保时捷Taycan T来袭