一个很有趣的现象:
在C++ 编程过程中 有可能会出现
代码如下:
using namespace std; int main() { unsigned var_1=1; int var_2=-1; cout<<a*b<<endl; return 0; }
结果:
xiandonghua@No:~/c++/c++bin$ ./built_in_type 4294967295
分析上述代码,可以看出,var_1为无符号整形,当一个无符号整形与int对象进行数字运算时,int会强制转换成无符号类型。
转义字符'\r'(回车符),'\n(换行符)'
的练习过程中(Linux g++编译器),出现另一种有趣的结果。
代码如下:
using namespace std; int main() { cout<<"name \r bob"; // cout<<"name \r bob\n "; return 0; }
结果如下:
xiandonghua@No:~/c++/c++bin$ ./built_in_type bobxiandonghua@No:~/c++/c++bin$
‘’bob‘’之前的字符去哪了?
我又尝试把上述代码中注释部分还原:
using namespace std; int main() { cout<<"name \r bob"; cout<<"name \r bob\n "; return 0; }
结果如下:
xiandonghua@No:~/c++/c++bin$ ./built_in_type bobname xiandonghua@No:~/c++/c++bin$
尝试分析了一下:
第一句打印语句中‘\r‘ 之前的字符串没有显示,第二句中’bob‘没有显示。
然后各种找度娘:
回车:将打印头移到本行行首(继续输出会覆盖之前的字符);
所以当编译器遇到'\r'时它会将指针指向本行行首并且继续输出'\r'之后的内容'bob'。(初学者的理解可能不太对)
换行:将打印头移动下行,水平位置不变。
那就意味着它会跳到下一行行首,并不影响前面的输出。
总上看来,以上两个问题就解决了:
当第一句打印语句执行的时候遇到'\r'跳转到本行行首时覆盖掉''name'' ,紧接着输出"bob",然后到达第二句打印语句时,原本语句"bobname"被中的部分内容被第二条打印语句中'\r'之后的内容覆盖掉。
例如:
using namespace std; int main() { cout<<"name \r occupation"; cout<<"name \r ****\n "; return 0; }
按照上面分析一下,此时输出的结果应该是什么?
猜测: ****pationname
结果:
xiandonghua@No:~/c++/c++bin$ ./built_in_type ****pationname xiandonghua@No:~/c++/c++bin$
看样子目前这样的理解是可行的。
初始化
using namespace std; int main() { int var_1=11; int var_2={22}; //c++11标准之后方可使用 int var_3(33); int var_4{44}; cout<<var_1<<"\t"<<var_2<<"\t"<<var_3<<"\t"<<var_4<<endl; return 0; }
编译过程:
xiandonghua@No:~/c++/srccode$ g++ built_in_type.cpp -o ../c++bin/built_in_type -std=c++11 #-std=c++11使用c++11标准
结果:
xiandonghua@No:~/c++/c++bin$ ./built_in_type 11 22 33 44
如果没有使用c++11的标准的话
结果会产生警告
xiandonghua@No:~/c++/srccode$ g++ built_in_type.cpp -o ../c++bin/built_in_type built_in_type.cpp: In function ‘int main()’: built_in_type.cpp:8:12: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 int var_4{44}; ^
类似int var={0} ; //列表初始化
,这中初始化用于built-in type变量时,与其他初始化不同点在于:
如果你使用一个不恰当的值(比如double值初始化integer值),去初始化给一个变量,编译器会报错。
built_in_type.cpp: In function ‘int main()’: built_in_type.cpp:8:18: error: narrowing conversion of ‘4.4439999999999998e+1’ from ‘double’ to ‘int’ inside { } [-Wnarrowing] int var_4{44.44}; ^
一步一步慢慢学,不怕学的比别人慢,就怕什么也没学懂。
----至自己