a&b的结果是什么?

这很尴尬,但按比例运算符在C ++标准中定义如下(我的重点)。

通常的算术转换被执行; 结果是它的操作数的按位“与”function 。 该运算符仅适用于整数或非范围的枚举操作数。

这看起来对我来说毫无意义。 据我所知,“按位与function”在标准的任何地方都没有定义。

我知道AND函数很好理解,因此可能不需要解释。 “按位”这个词的含义也应该比较清楚:函数应用于其操作数的相应位。 但是,构成操作数的部分是不明确的。

是什么赋予了?

这是不明确的。 关于按位操作的标准意味着什么问题是一些缺陷报告的主题。

例如缺陷报告1857:有关位的其他问题 :

5.11 [expr.bit.and],5.12 [expr.xor]和5.13 [expr.or]中按位运算的规范在描述操作时使用未定义的术语“按位”,而不指定是否为值或在视图中的对象表示。

部分解决方法可能是将“bit”(C ++中目前未定义的)定义为2的给定幂的值。

答复是:

CWG决定重新描述操作本身,以避免引用位,将定义“位”等更大的问题分解为1943年的问题供进一步考虑。

和缺陷报告1943年说:

CWG在2014 – 06年度(拉珀斯维尔)会议上决定仅处理由问题1857和1861提出的问题的一小部分。这个问题是其余问题的占位符,例如根据价值2 n ,指定位域是否有符号位等

从这个缺陷报告1796中我们可以看出:空字符的所有位为零是否是一个有意义的要求? ,这个标准意味着什么时候它涉及到影响/影响其他部分的问题:

根据2.3 [lex.charset]第3段,

基本执行字符集和基本执行宽字符集应分别包含基本源字符集的所有成员,加上表示alert,backspace和回车的控制字符,加上空字符(分别为空宽字符),其表示全部为零。

不清楚便携式程序可以检查表示的位; 相反,它似乎仅限于检查与值表示相对应的数字位(3.9.1 [basic.fundamental]段落1)。 要求空字符值比较等于0或'\ 0'而不是指定表示的位模式可能更合适。

对于移位,位运算,位运算符或者运算符的定义也存在类似的问题:对表示的位模式或者将这些模式解释为数字所产生的值的规范约束是什么?

在这种情况下,决议是要改变的:

表示全部为零

至:

值是0。

请注意, 正如ecatmur的回答中所提到的, C ++标准草案确实按照第3节第3.9.1[basic.fundamental]中的C标准第5.2.4.2.1节的规定,而不是从C标准的第6.5/46.5/4节至less告诉我们结果是实现定义的。 我在下面的评论中解释说,C ++标准只能明确地包含来自规范引用的文本。

[basic.fundamental] / 3依据C 5.2.4.2.1。 在C ++中按位运算符被低估的似乎是合理的,同样也要遵循C,在本例中是6.5.10 / 4:

二进制&运算符的结果是操作数的按位“与”(也就是说,当且仅当转换的操作数中的每个对应位都置位时,结果中的每个位都被置位)。

请注意,C 6.5 / 4具有:

一些运算符(一元运算符~和二元运算符<<>>&^|统称为按位运算符 )需要具有整数types的操作数。 这些运算符产生取决于整数的内部表示的值,并且具有用于签名types的实现定义和未定义方面。

整数的内部表示当然是在6.2.6.2/1,/ 2中描述的。

C ++标准将存储定义为一定数量的位。 实现可能决定什么意思归属于一个特定的位; 这就是说,二进制AND应该在概念0和1上形成特定types的表示。

3.9.1.7。 (…)整数types的表示应使用纯二进制编码系统来定义值。 49 (…)

3.9.1,脚注49)使用二进制数字0和1的整数的位置表示,其中由连续位表示的值是可加的,以1开始,并且乘以2的连续整数幂,除了位最高的位置

这意味着对于所使用的任何物理表示,二进制AND根据AND函数的真值表(对于每个位号i,从适当的操作数取A i和B i位,并且只有在两者都是1时才产生值1,否则为位R i产生一个0)。所得到的值由实现来解释,但是无论select什么,它都必须符合关于诸如OR和XOR的其他二进制操作的其他期望。

在法律上,我们可以考虑所有的按位运算有未定义的行为,因为它们没有实际定义。

更合理的是,我们需要运用常识,并将这些操作的通用含义应用到操作数的 (因此称为“按位”)。

但是没有任何其他的说明。 耻辱我的回答不能被认为是规范的措辞。