是什么类型的操作?

时间:2014-03-06 21:19:49

标签: c

在C中,是否将变量/值类型转换为一元运算?

要添加到这个是类型化整数值(可能在你应用掩码之前)也是一元操作?假设我有

((uint64_t)1 << 30 & 0xFFFF0000FFFF0000LL)

1填充零(最多64位)然后移位?

3 个答案:

答案 0 :(得分:6)

逻辑上,是的,将它视为一元运算符是合理的,因为它需要一个操作数。

但是如果你看一下C标准对表达式进行分类的方式,第6.5.3节将介绍一元运算符,第6.5.4节将单独描述强制运算符。

实际上至少存在一个区别很重要的案例。

sizeof unary-expresson

一元表达式的几种形式之一。如果一个强制转换运算符(type-name)被视为一元运算符,那么这就是:

sizeof (int) 42

将是一个有效的一元表达式:42将是强制转换运算符的操作数,而后者又是sizeof一元运算符的操作数。但实际上这是一个语法错误(因为sizeof (int)本身就是一个有效的表达式)。为了避免这个问题,一元运算符和强制转换运算符是分开定义的(实际上给出了不同的优先级)。要在避免语法错误的同时编写上述内容,您需要添加括号:

sizeof ((int) 42)

参考:N1570,2011年ISO C标准的最新免费草案。

答案 1 :(得分:4)

作为一元运算符只不过只有一个参数。 type参数不作为参数,因此转换操作符是一元的。

您的第二个问题与运营商优先级有关。强制转换具有与其他一元运算符相同的优先级,高于转移<<,后者又高于二进制和&

所以你的代码相当于:

((((uint64_t)1) << 30) & 0xFFFF0000FFFF0000LL)

答案 2 :(得分:3)

C标准没有具体谈到“一元行动”。他们有“一元运算符”(“-ors”vs“-ions”),而演员不属于前者,因为它们是单独列出的。

然而,在数学上,它们绝对是一元的:它们有一个输入和一个输出。

您的问题似乎不是关于术语,而是关于绑定

(uint64_t)1 << 30

绑定为:

((uint64_t)1) << 30
例如,

然后执行所有绑定在一起的操作,以便将&操作应用于其结果。答案是肯定的,他们这样做。虽然标准不使用运算符优先级语法,但您可以从标准语法中派生出一个,而在这种语法中,强制转换运算符和一元运算符的优先级高于移位运算符,后者的优先级高于位运算符。