我最近遇到过这样的代码
struct tcpheader {
unsigned char tcph_reserved:4, tcph_offset:4;
....
显而易见:
类的做法,但为什么我从未正式见过这个呢?
我无法找到:
运算符的正式定义。我搜索过了
分割,拆分和分割变量声明无济于事。
任何人都有关于:
运营商的一些信息吗?
答案 0 :(得分:6)
它不是"运算符",它是一种声明bit fields的方式。
它仅在struct
和union
声明中有效,并且基本上允许您告诉编译器您希望该字段使用多少位。
因此,您的示例为每个字段指定了四个位,可能希望将两个字段打包到相同的8位字节中。
请注意,使用位字段时的位顺序和布局是未指定的,直到编译器,这使得它们非常难以移植。
答案 1 :(得分:1)
:
不是运算符,它被称为冒号标点符号,用于指定位字段的宽度。
答案 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()
句子的简写,具有可用于表达式的优点。
正如您所看到的,角色:
是三元运算符 ?:
的一部分,但它本身并不是运营商,因为联合角色?
。