C99中“算术运算”的定义是什么?

时间:2014-07-10 00:43:43

标签: c c99 language-lawyer

在C99中,术语算术运算出现了16次,但我没有看到它的定义。

术语算术运算符仅在文本中出现两次(同样没有定义)但它确实出现在索引中:

  

算术运算符

     
    

添加剂,6.5.6,G.5.2
    按位,6.5.10,6.5.11,6.5.12
    增量和减量,6.5.2.4,6.5.3.1
    乘法6.5.5,G.5.1
    转移,6.5.7
    一元,6.5.3.3

  

然后我们+ - | &(二进制)++ -- *(二进制){{1 }} / % << >>作为算术运算符,如果索引被认为是规范性的!

也许我们应该将算术运算识别为使用算术运算符。但是F9.4.5说~函数也是算术运算,并且参考IEC 60559(又名IEEE754)了解详情。因此,必须有算术运算,而不仅仅是使用算术运算符。

3 个答案:

答案 0 :(得分:7)

由于我们没有正式的定义,让我们看看我们是否可以将算术运算应该是什么的基本解释拼凑在一起。这将是推测性的,但我找不到任何明显的缺陷报告或未解决的问题。

我想我会从所谓的算术类型开始,这将在6.2.5 18 中说明(强调我的去向前):

  

整数和浮点类型统称为算术类型。   每种算术类型属于一个类型域:真实类型域   包括真实类型,复杂类型域包括   复杂的类型。

好的,所以我们知道算术运算必须对整数或浮点类型进行操作。什么是操作?我们似乎已经很好地定义了5.1.2.3 节目执行 2 中的内容,其中说明了:

  

访问易失性对象,修改对象,修改文件或   调用执行任何那些操作的函数都是一面   效果, 11)这是执行状态的变化   环境。 [...]

因此修改对象或调用执行该操作的函数,这是一个操作。什么是对象?第3.14部分说:

  

执行环境中的数据存储区域的内容   它可以代表值

虽然标准似乎更宽松地使用术语操作来表示评估,例如在7.12.1 部分<错误条件的处理中,它说:

  

为所有人指定了每个函数的行为   除非另有说明,否则其输入参数的可表示值   除此以外。 每个函数都应该像单个函数一样执行   操作,不会产生任何外部可见的异常   条件。

并在6.5 表达式 8 中说明:

  

可以缩小浮动表达式,即进行评估   这是原子操作[...]

因此,这似乎意味着评估是一项操作。

因此,从这些部分可以看出,几乎所有算术运算符和任何数学函数都属于算术运算的常识定义。

答案 1 :(得分:3)

在SIGFPE信号的定义中,我能找到的最有说服力的定义是 7.14 Signal Handling ,第3段:

  

SIGFPE - 错误的算术运算,例如零分频或导致溢出的运算

然后可以得出结论,任何可能导致SIGFPE被引发的操作都可以被认为是算术运算;只有算术运算才能导致SIGFPE信号被提升。

它涵盖<math.h>和算术运算符中的几乎所有内容,如果实现则涵盖<complex.h>。虽然可能不会针对整数类型引发信号,但允许有符号溢出和其他“异常”条件生成陷阱表示,这意味着在获得有效值之前不能可靠地执行其他操作 - 这只能通过分配。换句话说,该定义可以同样适用于对整数值的运算。

因此,除了获取对象/类型的大小,取消引用指针以及获取对象的地址之外的任何操作都可以被认为是算术运算。请注意a[n]*((a) + (n)),因此即使使用数组也可视为算术运算。

答案 2 :(得分:1)

算术运算涉及操纵数字sqrt也操纵数字,这可能是标准称它为算术运算的原因。

相关问题