考虑二进制值0100 1011。这个代表什么价值?你可能会说180,如果这是标准的无符号二进制数,你会是正确的。
然而,如果这个值被存储使用两个的补充,它将是- 76。
如果该值被编码的其他方式,它可能是其他完全。
那么C++知道打印变量包含二进制1011 0100 180或76?
返回在第2.1节-基本寻址和变量声明,我们说,“当你分配一个值到一个数据类型,编译器和处理器需要关心的细节编码您的价值到适当的序列位为该数据类型。当你要求你的价值回来,你的号码是“重组”从内存中的位序列。”
然而,如果这个值被存储使用两个的补充,它将是- 76。
如果该值被编码的其他方式,它可能是其他完全。
那么C++知道打印变量包含二进制1011 0100 180或76?
返回在第2.1节-基本寻址和变量声明,我们说,“当你分配一个值到一个数据类型,编译器和处理器需要关心的细节编码您的价值到适当的序列位为该数据类型。当你要求你的价值回来,你的号码是“重组”从内存中的位序列。”
因此,答案是:它使用了变量的类型,将基本的二进制表示转换成预期的形式。因此,如果变量类型是一个无符号整数,它会知道0100个1011是标准的二进制,并且应该打印为180。如果变量是一个有符号的整数,它会知道,0100个1011使用两个的补充编码(假设这是它是使用),并应打印为- 76。
这一课是建立在概念第1.3a,cout,一看CIN,endl,命名空间,并使用报表。
假装你是一个学生的教室的老师。为了举例,让我们说有两个男孩叫“亚历克斯”。如果你说,“亚历克斯得到了一个关于他的测试”,亚历克斯你指的是什么?没有人知道,除非你有办法消除歧义,亚历克斯你的意思。也许你指的是一个,或使用他们的最后一个名字。如果两个亚历克斯的在不同的教室里,就不会有一个问题-问题是真的有两个东西在同一个地方同一个名字。并且,事实上,随着课堂上学生数量的增加,有两个相同的名字的学生的几率成倍增加。
类似的问题可能会出现在编程时,两个标识符(变量和/或函数名)与相同的名称被引入到相同的范围。当这种情况发生时,一个命名冲突将导致,编译器将产生一个错误,因为它没有足够的信息来解决模糊性。随着程序变得越来越大,标识符的数量呈线性增加,这反过来又导致命名冲突的概率成倍增加。
让我们来看看命名冲突的一个例子。在下面的例子中,foo。H和粘性。h头文件包含的功能,做不同的事情,但具有相同的名称和参数。
2
3
4
5
6
7
8
9
#include "foo.h"
#include "goo.h"
#include <iostream>
int main()
{
std::cout << doSomething(4, 3); // which doSomething will we get?
return 0;
}