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

在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

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

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

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

我想我会从所谓的算术类型开始,这将在第6.2.5节中介绍第18段的类型强调我的未来 ):

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

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

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

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

执行环境中的数据存储区域,其内容可以表示值

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

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

并在第6.5表达8段中说:

浮动表达式可能会被收缩,也就是说,它被评估为primefaces操作[…]

所以这似乎意味着评估是一项操作。

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

我能找到的最有说服力的一个隐含的定义在于SIGFPE信号定义中的7.14信号处理 ,第3段:

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

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

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

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

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