在C / C ++中定义运算符的位置以及它们在这些语言中的实现方式是什么?

时间:2011-07-19 13:01:43

标签: c++ c

编译器如何知道哪个运算符与哪个功能相关联?

5 个答案:

答案 0 :(得分:2)

这是一个开放式问题。进一步询问,你要我们写一本书。实际上是多本书:

  • 一本关于现代代数的书,它解释了数字是什么以及我们认为理所当然的那些数学运算的运作方式;
  • 计算机科学的多本书籍,如结构和算法,汇编语言和编译器理论,描述了如何将高级语言翻译成CPU可以执行的指令;
  • 来自计算机工程的多本书籍,描述计算机科学家认为理所当然的CPU,算术逻辑单元,浮点处理器,门和其他计算机内部。

所以,简短而且可能有点令人不满意的答案:
运算符在C中具有固定含义。该含义在某种程度上在C ISO / IEC标准中指定。该标准没有规定1 + 1 = 2等。这是您在高中和之前的低级代数课程中学到的知识。我们认为理所当然的东西背后的理论是你在现代代数课程中学到的东西(通常由数学学生在经过多个微积分课程后学习)。

运算符在C ++中具有更灵活的含义。操作符可以在C ++中重载。没有这个重载,C ++中的运算符的含义与C中的几乎相同。但是,C ++使程序员能够定义foo+barfoobar的含义。是一些用户定义类型的实例。该标准指定了这些重载运算符的签名,并指定了实现如何应用这些重载。如何将foobar完全相加:这取决于重载运算符的实现者。

答案 1 :(得分:1)

Bjarne Stroustrup的书(The C ++ Programming Language)展示了如何实现一种简单的计算器语言。该计算器可以计算简单的总和,如5 + 3 *16。现在,编译器必须处理更复杂的表达式,包括变量和函数调用,例如a + 5 * foo(),但这个想法仍然是一样的。当您看到+时,首先查看左侧的数字,然后是右侧的数字,然后添加这些数字,因为这是+的含义。

答案 2 :(得分:1)

编译器知道每个内置运算符的功能,因为编写编译器的程序员知道它的功能。编译器就像任何其他程序一样,它可以做任何设计师想要的事情。

编译器知道用户定义(重载)运算符的行为,因为它已经看到了这些运算符的声明,所以当它看到它们在程序的其他地方使用时,它会检查它的可用重载列表并选择最好的适合所使用的操作数的组合。该标准定义了如何根据类型,当前范围以及定义的任何类型转换来确定“最佳”组合的内容。如果没有最佳匹配,则会出现编译错误。

答案 3 :(得分:1)

要回答标题中的问题,操作符在构成编译器的源代码中“定义”。编译器只是一个程序,就像任何其他程序一样。它读入C或C ++代码,并根据grammar进行解析。然后将输入转换为机器语言。 CPU最终在其硬件中“定义”机器语言的操作。例如,“+”可能触发通过纹波进位加法器馈送的各种寄存器的内容。

其他语言以大致相同的方式实现运算符。

答案 4 :(得分:0)

对于C: Dennis Ritchie decided运营商在20世纪70年代早期会做些什么,每个编译器作者的工作就是通过以下方式实现这些决策:根据操作数类型生成符合规范的代码。

对于C ++: 对于C,现有的运算符也可以通过库和应用程序代码扩展到新类型。毋庸置疑,在某些时候,操作必须使用核心功能或汇编语言来实现。