C++ built-in type

一个很有趣的现象:

在C++ 编程过程中 有可能会出现

代码如下:

#include<iostream>
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++编译器),出现另一种有趣的结果。

代码如下:

#include<iostream>
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‘’之前的字符去哪了?

我又尝试把上述代码中注释部分还原:


#include<iostream>
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'之后的内容覆盖掉。

例如:


#include<iostream>
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$ 

看样子目前这样的理解是可行的。


初始化

#include<iostream>
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};
                  ^


一步一步慢慢学,不怕学的比别人慢,就怕什么也没学懂。

----至自己

猜你喜欢

转载自blog.csdn.net/arctic_fox_cn/article/details/80272840
今日推荐