繁体   English   中英

是什么类型的操作?

[英]Is typecasting a unary operation?

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

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

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

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

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

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

实际上至少有一种区别很重要。

sizeof 单目expresson

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

sizeof (int) 42

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

sizeof ((int) 42)

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

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

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

所以你的代码相当于:

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

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

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

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

(uint64_t)1 << 30

绑定为:

((uint64_t)1) << 30

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM