来自其他编程语言,我希望以下语句都能产生相同的结果。有人可以解释为什么括号在这里有所作为吗?
PS D:\> "ab", "cd"
ab
cd
PS D:\> "a"+"b" , "c"+"d"
ab cd
PS D:\> "a"+"b" , ("c"+"d")
ab cd
PS D:\> ("a"+"b"), "c"+"d"
ab
c
d
PS D:\> ("a"+"b"), ("c"+"d")
ab
cd
PS D:\>
答案 0 :(得分:11)
适用的规则如下:
,
是一个一元或二元运算符,它创建一个操作数数组,它的优先级高于+
运算符。+
运算符可用于数字加法,字符串连接和数组连接。 left 操作数的数据类型决定了执行的操作类型。如果可能,将右操作数强制转换为左操作数的数据类型;如果不可能,则抛出错误。 * *这解释了看似不一致的结果,例如"foo" + 1
评估为foo1
,但1 + "foo"
会给您一个错误。
因此,让我们看一下您的测试用例,并分析上述逻辑后发生的情况。
案例I:
"ab", "cd"
这个非常简单:,
运算符创建了一个包含两个字符串ab
和bc
的数组。
案例II:
"a" + "b", "c" + "d"
乍一看这个似乎是违反直觉的;关键是要意识到在,
之前评估+
。以下是逐步获得结果的方法:
"b", "c"
(由于,
优先于+
),创建元素b
和c
的数组。+
运算符应用于"a"
和步骤1中创建的数组。由于左操作数"a"
是字符串,因此执行字符串连接。b
和c
数组成为字符串b c
。a
与b c
联系起来ab c
。ab c
与d
连接以生成最终结果ab cd
案例III:
"a"+"b" , ("c"+"d")
这巧合得出相同的结果;评估的方式不同:
("c"+"d")
。这是一个普通的字母串连接,产生字符串cd
。,
运算符应用于"b"
和步骤1中的字符串,创建元素b
和cd
的数组。 (这是在"a" + "b"
之前评估的,因为,
的优先级高于+
。)+
运算符应用于"a"
和在步骤2中创建的数组。由于左操作数是字符串,因此执行字符串连接。b
和cd
数组被投射为字符串b cd
。a
和b cd
会连接在一起,从而产生最终输出ab cd
。案例IV:
("a" + "b"), "c" + "d"
这是最有趣的测试用例,可能是最直观的,因为它会产生可能看起来不一致的结果。以下是它的评估方式:
("a" + "b")
,生成字符串ab
。,
已应用于步骤1和"c"
中的字符串,从而创建了元素ab
和c
的数组。+
运算符应用于步骤2中的数组和下一个标记"d"
。这次,左操作数是一个数组,因此执行数组连接。"d"
被强制转换为一个元素的数组。ab
,c
和d
的数组。案例五:
("a" + "b"), ("c" + "d")
到目前为止,应该很容易看到这里发生了什么:
("a" + "b")
被评估为字符串ab
。("c" + "d")
被评估为字符串cd
。,
已应用于步骤1和2中的字符串,创建了ab
和cd
的数组。您可以使用命令
查看precedence tableGet-Help about_Operator_Precedence
(帮助文档名称可以制表,所以为了保存输入,help about_op
TAB TAB )