今天我遇到了一行有趣的代码。我不知道使用“或”这个词是合法的。我以为只有||。 这叫什么,我在哪里可以阅读更多信息? 感谢
if (V_discount == "y" or "Y" or "Yes" or "yes")
{
cout << "Your discount is: ";
}
编辑:事实证明if语句没有做太多。我把一个cout&lt;&lt;“hi”;在括号中,无论V_discount中包含什么,它都会执行。
我认为它被称为是因为netbeans突出显示“或”蓝色。
第二次编辑:
v == "y" || "Y"
与
不同v == "y" || v == "Y"
只有后者才能“按预期”运作。 “按预期”检查v是否为字符串“y”或v是字符串“Y”。
答案 0 :(得分:7)
它被称为“替代令牌”,记录在当前ISO C ++标准的第2.6节[lex.digraph]和1998年ISO C ++标准的第2.5节中。 (这是定义“有向图”的相同部分,例如<%
的{{1}}和{
的{{1}}。
但是您展示的代码使用不正确。
首先,如果%:
是#
,那么您可能想要这样:
x
而不是:
int
后者实际上是合法的,但它意味着完全不同的东西。
比较字符串是否平等并不简单。如果if (x == 10 or x == 20 or x == 30)
是if (x == 10 or 20 or 30)
或V_discount
,那么比较char*
比较指针值,而不是字符串的内容,它们肯定会比较不等。如果char[]
是V_discount == "yes"
,那么我认为它会起作用 - 但您仍需要将它与每个文字单独进行比较。否则,正如托尼·德罗伊的答案所说的那样,它会编译,但会完全意外地涉及到V_discount
的隐式转换。
答案 1 :(得分:2)
C ++编程语言(第829页)只是将它们称为“关键字”,而不是给它们任何特殊名称。 C ++ 11标准(第2.6节)将它们称为“替代令牌表示”,但也包括例如该名称下的<%
(对于{
)(我想,这解释了为什么它不能只称它们为“关键字”);我不知道早期的标准是否使用了相同的术语。
维基百科calls them "operator synonyms",但该名称在其他地方似乎没有货币。
答案 2 :(得分:2)
今天我遇到了一行有趣的代码。我不知道使用“或”这个词是合法的。我以为只有||。这叫什么,我在哪里可以阅读更多信息?感谢
这是合法的。遗憾的是,Microsoft Visual C ++编译器不支持它(至少在默认情况下 - 可能有一个模糊的命令行开关或其他东西)。由于缺乏可移植性,即使是了解它们的人(or
,and
,xor
)并且在风格上更喜欢它们也可能决定不使用它们。
if(V_discount ==“y”或“Y”或“是”或“是”){cout&lt;&lt; “你的折扣是:”; }
“y”“Y”“是”和“是”都是字符串文字 - 基本上是编译器生成的引用文本的字符数组和NUL终结符后缀(即“C”字符串表示,对于ASCII文本ASCIIZ经常使用名称 - Z引用最后一个字节的零/ NUL值。当这些值在逻辑or
表达式中组合时,它们首先衰减到指向第一个字符的指针,然后指针被安静地转换为可以一起进行OR运算的bool
值。指针将全部为非0值,用于寻址相应的字符缓冲区,当向bool
提升积分值时,C ++会将任何非0值视为true
(和0 false
)。因此,整个表达式等同于(V_discount == "y") or true or true or true
。任何or true
都是true
,因此if
语句总是执行以下语句块,如您所见......
编辑:事实证明if语句没有做太多。我把一个cout&lt;&lt;“hi”;在括号中,无论V_discount中包含什么,它都会执行。
我认为它被称为是因为netbeans突出显示“或”蓝色。
编辑通常会在他们支持的语言中有一个重要的“关键字”列表,通常有与屏幕(或 - 打印)风格相对应的各种子类别,但这并不一定与标准语言的分类相对应。在C ++中,or
只是||
的功能识别替代品,两者都被称为“或”或更精确地将它们与按位版本区分开来 - “逻辑或”。
第二次编辑:
v == "y" || "Y" is not the same as
v == "y" || v == "Y"
只有后者才能“按预期”运作。 “按预期”检查v是否为字符串“y”或v是字符串“Y”。
一般都是如此。如果v
是用户定义的类型并且||
运算符被程序员重载(替换),它实际上可以“按预期”运行,但是我们C ++程序员习惯于键入第二种形式(适用于内置和标准库值语义类型,如int和std::string
),我们发现v == "y" || "Y"
“工作”按v == "y" || v == "Y"
令人难以置信的混淆,并且C ++文献推荐不变反对改变奇怪但开发人员熟悉的解释前一种陈述的方式。
请注意,char v[some-number];
中的v
和候选人文字,上述比较需要写入strcmp(v, "y") or strcmp(v == "Y")
。