If statement 正在写'if(foobar==(“this”that)检查foobar是否等于';这";或;那";支持任何主要语言?
我有一个模糊的记忆,能够用这样的语言编写if语句:If statement 正在写'if(foobar==(“this”that)检查foobar是否等于';这";或;那";支持任何主要语言?,if-statement,programming-languages,If Statement,Programming Languages,我有一个模糊的记忆,能够用这样的语言编写if语句: if (foobar == ("this" || "that")) if(new MyClass('this', 'that', 'and something else').in(foobar)) 而不是: if (foobar == "this" || foobar == "that") 后者更冗长,因此对我来说没有那么大的审美吸引力 前一个公约是否得到任何主要语言的支持?这一点没有得到广泛支持有什么原因吗?我似乎记得Pascal在语句
if (foobar == ("this" || "that"))
if(new MyClass('this', 'that', 'and something else').in(foobar))
而不是:
if (foobar == "this" || foobar == "that")
后者更冗长,因此对我来说没有那么大的审美吸引力
前一个公约是否得到任何主要语言的支持?这一点没有得到广泛支持有什么原因吗?我似乎记得Pascal在语句中有一个
,如:
if x in (foo, bar) then
...
至于为什么它没有得到更广泛的支持,我不明白。这似乎是一块很好的语法糖。编程语言具有这一特性
通过使用发电机,您可以
if i = (0 | 1) then write("0 or 1")
如果i=0或i=1,则成功。你甚至可以:
if (i | j | k) = (0 | 1) then write("0 or 1")
如果i、j或k中的任何一个等于0或1,则成功
这背后的基本思想是,每个(1 | 2 | 3..)
序列创建一个生成器,该生成器将依次返回每个值,直到值用完为止。当您在这样的布尔位置使用生成器时,将从生成器请求值,直到比较成功。当您在比较的任一侧组合两个生成器时,将尝试所有可能的组合,直到其中一个成功。(如果值不相等,相等运算符将“失败”,而不是返回false。)我记得使用该语法的唯一地方是大约25年前的COBOL
我怀疑它没有得到广泛支持的原因是它导致了编译器无法解决的歧义。在您的特定情况下,这不是一个特别的问题,因为“this”和“that”是字符串,条件OR运算符对它们没有意义。但是,用C这样的语言来考虑这个片段,其中条件的结果是布尔值0或1:
int a = 22;
int b = 99;
int rslt = SomeFunction();
if (rslt == (a || b))
此时,编译器无法可靠地确定您想要什么。你是否打算:
if (rslt == a || rslt == b)
或者,你是否打算:
if ((rslt == 0 && a == 0 && b == 0) || (rslt == 1 && a == 1 && b == 1))
您可以限制可以使用这种语法的类型,但随后您会在理想情况下应该是正交语法的基础上堆积异常。这将使用户感到困惑,并使编译器变得复杂
它还强制表达式在条件语句中的求值方式与赋值语句中的求值方式不同。这无疑也会使编译器复杂化
它当然可以工作,但我认为它需要使用重载符号的新语法,所有这些都是为了一个值得怀疑的好处。操作符是一个二进制操作符,它接受两个操作数并返回一个值。由于大多数主要语言对表达式求值的方式,因此不可能使用该语法检查一个值是否等于一组值中的一个。这就是为什么大多数主要语言都不支持它
然而,@1800信息发布的
语法中的,得到了许多语言的支持。如果您的语言不支持它,您可以创建一个名为in()
或in_array()
的函数,该函数接受两个参数,一个值和一个数组,如果数组包含该值,则返回true
。(例如,PHP有一个内置函数。)交互式小说(文本冒险)创作语言支持使用“or”运算符(不同于通常写为“| |”的逻辑or):
这一点没有得到广泛支持有什么原因吗
这是一种特殊的魔法;除了简单的示例表达式之外,不清楚它在其他任何方面都起什么作用
if (n or 8==m+(1 or 2) or 7) // plausible
if (qty<4 or 5) // huh?
a= "cat" or "dog" // er
if(n或8==m+(1或2)或7)//似是而非
如果(qty在Python中,您可以这样编写
if(foobar in ('this', 'that', 'and something else'))
(‘this’、‘that’、‘and other’)-这是一种列表类型
因此,我认为在任何oop语言中,您都可以创建自己的类:
MyClass(object):
List values
def in(value):
return search_value_in_values(value)
写下这样的话:
if (foobar == ("this" || "that"))
if(new MyClass('this', 'that', 'and something else').in(foobar))
你可以用C或C++写……它不做你想做的事情;)Pascal中的语法使用了集合,它必须是一个整数类型。据我所知,没有支持字符串集的Pascal版本。似乎我还记得Ada也支持此版本,但它可能没有处理字符串。Logical-or写为“&&”?我想你的符号弄错了,先生。