【问题标题】:Powershell Arrays and ParenthesisPowershell 数组和括号
【发布时间】:2014-04-24 21:40:32
【问题描述】:

来自其他编程语言,我希望以下语句都能产生相同的结果。有人能解释一下为什么括号在这里会有所不同吗?

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:\>

【问题讨论】:

  • 查看 Get-Help about_operator_precedence 以获取表达式中所有运算符及其各自优先级的列表。

标签: powershell syntax


【解决方案1】:

适用规则如下:

  • , 是一元或二元运算符,用于创建操作数数组,它的优先级高于 + 运算符。
  • + 运算符可用于数值加法、字符串连接和数组连接。 left 操作数的数据类型决定了执行哪种类型的操作。如果可能,将右操作数转换为左操作数的数据类型;如果不可能,则会引发错误。 *
  • 如果优先级相等,则从左到右进行评估。
  • 通过列出以空格分隔的元素,将数组转换为字符串。
  • 如您所料,括号的优先级高于任何运算符,并导致在括号外的任何内容之前计算封闭的表达式。
  • 数组对象的默认输出是一个元素列表,每行一个。

* 这解释了看似不一致的结果,例如 "foo" + 1 的计算结果为 foo1,但 1 + "foo" 给您一个错误。

那么,让我们看看你的测试用例,并按照上面解释的逻辑分析会发生什么。


案例一:

"ab", "cd"

这个非常简单:, 运算符创建一个包含两个字符串的数组,abbc


案例二:

"a" + "b", "c" + "d"

乍一看,这似乎违反直觉;关键是要意识到,+ 之前被评估。下面是如何一步一步得到结果的:

  1. 首先评估"b", "c"(由于, 优先于+),创建元素bc 的数组。
  2. 接下来,+ 运算符应用于"a" 和步骤 1 中创建的数组。由于左操作数 "a" 是字符串,因此执行字符串连接。
  3. 若要将字符串与数组连接,则将数组转换为字符串。 bc 的数组变成了字符串 b c
  4. ab c 连接会产生ab c
  5. 最后,ab cd 连接以产生最终结果,ab cd

案例三:

"a"+"b" , ("c"+"d")

巧合的是,这会产生相同的结果;评估发生方式不同:

  1. 由于括号,("c"+"d") 首先被评估。这是一个普通的字符串连接,结果是字符串cd
  2. 接下来,, 运算符应用于"b" 和步骤 1 中的字符串,创建元素 bcd 的数组。 (这是在"a" + "b" 之前评估的,因为, 的优先级高于+。)
  3. 然后,+ 运算符应用于"a" 和步骤 2 中创建的数组。由于左操作数是字符串,因此执行字符串连接。
  4. bcd 的数组被转换为字符串 b cd
  5. 字符串ab cd 连接在一起,得到最终输出ab cd

案例四:

("a" + "b"),  "c" + "d"

这是最有趣的测试用例,也可能是最违反直觉的,因为它产生的结果可能看起来不一致。以下是它的评估方式:

  1. 与案例 III 步骤 1 类似,首先评估 ("a" + "b"),生成字符串 ab
  2. , 应用于第 1 步中的字符串和 "c",创建了一个由元素 abc 组成的数组。
  3. + 运算符应用于步骤 2 中的数组和下一个标记 "d"。这一次,左操作数是一个数组,所以执行了一个数组连接。
  4. 字符串操作数"d" 被转换为一个元素的数组。
  5. 这两个数组连接成一个元素数组 abcd

案例五:

("a" + "b"), ("c" + "d")

现在,应该很容易看出这里发生了什么:

  1. ("a" + "b") 被评估为字符串 ab
  2. ("c" + "d") 被评估为字符串 cd
  3. , 应用于第 1 步和第 2 步中的字符串,创建一个由abcd 组成的数组。

你可以通过命令看到precedence table

Get-Help about_Operator_Precedence

(帮助文档名称可以用制表符完成,所以为了节省打字,那是help about_opTABTAB

【讨论】:

  • 感谢您的精彩解释。这完全为我清除了。本质上,它是这样评估表达式的:"a" + ("b", "c") + "d"(("a"+"b"), "c") + "d"
  • 酷。无论如何,我都会添加对示例的分析,因为 SO 问题和答案旨在作为未来搜索者的参考资料。
  • 微软需要雇佣你来记录一切。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 2015-04-26
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
相关资源
最近更新 更多