接线员:在C中,它是什么?

时间:2014-09-02 11:22:15

标签: c operators

我最近遇到过这样的代码

struct tcpheader {
 unsigned char      tcph_reserved:4, tcph_offset:4;
 ....

显而易见:类的做法,但为什么我从未正式见过这个呢? 我无法找到:运算符的正式定义。我搜索过了 分割,拆分和分割变量声明无济于事。

任何人都有关于:运营商的一些信息吗?

4 个答案:

答案 0 :(得分:6)

它不是"运算符",它是一种声明bit fields的方式。

它仅在structunion声明中有效,并且基本上允许您告诉编译器您希望该字段使用多少位。

因此,您的示例为每个字段指定了四个位,可能希望将两个字段打包到相同的8位字节中。

请注意,使用位字段时的位顺序和布局是未指定的,直到编译器,这使得它们非常难以移植。

答案 1 :(得分:1)

:不是运算符,它被称为冒号标点符号,用于指定位字段的宽度。

http://en.wikipedia.org/wiki/Bit_field

答案 2 :(得分:1)

这是:不是运营商。这是Bitfields。一些网络搜索会产生比你想象的更多关于它们的信息。但基本上冒号后面的数字描述了该字段使用的位数。

在您的代码中 -

struct tcpheader {
 unsigned char      tcph_reserved:4, tcph_offset:4;

通常unsigned char有8位。 tcph_reserved:4表示您正在为tcph_reserved分配4位。

位字段仅在结构和联合中有效

答案 3 :(得分:0)

我不会在之前的答案中添加任何内容,这些答案很好地解释了:用于表示struct声明中的位字段成员的事实。

另一方面,在 C 中,我们有三元运算符 ? :以这种方式工作,例如:

    int condition = 3 > 4;
    char result1 = 'x', result2 = 'A';
    char x = (condition)? result1 : result2; 
  • 三元运算符评估condition
  • 如果condition 为真(非零值),则会评估表达式result1
  • 如果condition false (零值),则会评估表达式result2

换句话说,它是if()句子的简写,具有可用于表达式的优点。

正如您所看到的,角色:三元运算符 ?:的一部分,但它本身并不是运营商,因为联合角色?