在C++中,“and”和“&&”有什么区别?

4

最近我发现了一个使用了关键词and的代码,这个关键词起到了类似于&&的作用。那么它们两者是相同的吗?还是存在某些特定条件才能使用它们?


and&& 的另一种名称。 - Peter
7
你甚至可以像这样写一个骇人听闻的代码:void foo(std::string and s) :-/ (注:原文中有笔误,应为"std::string and s"而非"and"后面缺少"type") - Jarod42
1
@Jarod42 信不信由你,我曾经在一次正式的代码审查中遇到过这样的情况。我至今仍感到颤栗。还有一次,有人抱怨编译器发出了一个错误,指出X::operator&&(const X &) const无法为某个类X重载 - 结果证明他尝试提供了X::operator&&(const X &) constX::operator and(const X &) const - 认为它们是不同的。 - Peter
@Peter:体现了一个误解,即&&and不是等价运算符,但它们是等价的标记。出于这个原因,我决定回答。 - Bathsheba
7个回答

5

C++标准允许使用&&这个token来替代and这个token。

并非所有编译器都能正确实现这一点(有些不会处理,其他的则需要包含一个特殊头文件)。因此,使用and的代码可能被认为是奇怪的。

事实上,等价性在token级别而不是operator级别上意味着,自从C++11引入了右值引用符号,你可以安排好事情(无需预处理器)使得以下语句成立:

int and _int(string and vector);

是一个有效的函数原型。(它等同于 int&& _int(string&& vector)。)


1
即使在C++11之前,您也可以使用bitand玩得开心。 - eerorika
许多既是C编译器又是C++编译器(例如使用不同的开关)存在许多类似的异常。在几种这样的情况下,您所提到的“特殊头文件”是C头文件<iso646.h>,据记忆,它是在1995年左右作为C标准的修正案(而非完整版本)引入的,并使用宏定义了and等内容。 (在C++中,<iso646.h>通常会导致未定义的行为,因为它使用预处理器来#define C++语言关键字,但某些C++实现实际上需要它,如果您想要替代标记)。 - Peter

2
可以在这里看到,它们是同一件事。

2

0

0
"and"和"&&"在C++中有什么区别?
主要的区别在于"and"不使用字符"&"。
除此之外,它们没有任何区别。
有没有特定的条件可以使用它?
除了其他替代标记,例如双字母符号,它存在的目的是为了允许在具有字符编码(如BCD或ISO 646)的异域系统上编写程序,这些系统没有像"&"这样的特殊符号。
除非您在必须使用替代标记的系统上编写代码,否则通常不应使用它们。

0

They和运算符是它们的名称,即&&


-1

and 运算符是 && 运算符的替代品。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接