在C中,是否将变量/值类型转换为一元运算?
要添加到这个是类型化整数值(可能在你应用掩码之前)也是一元操作?假设我有
((uint64_t)1 << 30 & 0xFFFF0000FFFF0000LL)
1填充零(最多64位)然后移位?
答案 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
例如,然后执行所有绑定在一起的操作,以便将&
操作应用于其结果。答案是肯定的,他们这样做。虽然标准不使用运算符优先级语法,但您可以从标准语法中派生出一个,而在这种语法中,强制转换运算符和一元运算符的优先级高于移位运算符,后者的优先级高于位运算符。