【问题标题】:In csh, why does 4 - 3 + 1 == 0?在 csh 中,为什么 4 - 3 + 1 == 0?
【发布时间】:2010-11-03 20:20:58
【问题描述】:
#!/bin/csh

@ cows = 4 - 3 + 1
echo $cows

这个简单的 csh 脚本在运行时会产生“0”作为输出,而我期望“2”。

~root: csh simple.1
0

我看了一堆东西,唯一能想到的是“-”被解读为一元否定而不是减法,因此改变了运算符的优先级并以 4 - 4 而不是 2 + 1 结束。 它是否正确?如果是这样,有什么理由吗?如果没有...帮助!

编辑:所以他们是正确的联想!这些运算符在 C 中不是右结合的,是吗? C-Shell 与 C 有什么不同吗?

【问题讨论】:

  • 这里有一个更好的问题......为什么 csh 使用右关联解析树而不是左关联?
  • ... 还有一个更好的问题。为什么要使用 csh?
  • 我实际上并没有使用它。这是我试图为朋友回答的问题。这是新的讨论:stackoverflow.com/questions/1010119
  • 只是为了增加轻浮性,在 tcsh(/bin/csh 通常是符号链接)中,4 - 3 + 1 的计算结果为 2

标签: operators csh


【解决方案1】:

虽然您希望运算符保持关联,但它们是 right associative in csh,因此它被评估为 4-(3+1)

   -
  / \
 /   \
4     +
     / \
    3   1

【讨论】:

  • 那不是解析树。它不是 AST。再次查看 BNF,看看操作数和运算符都是表达式节点的子节点。编译器必须做额外的工作才能将解析树转换为表达式树。
【解决方案2】:

+ 和 - 运算符在 csh 中是右结合的。这意味着“4 - 3 + 1”被评估为“4 - (3 + 1)”。

【讨论】:

    【解决方案3】:

    运营商分组。它将运算读取为 4 - (3 + 1),而不是 (4 - 3) + 1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      相关资源
      最近更新 更多