在 csh 中,为啥 4 - 3 + 1 == 0?

Posted

技术标签:

【中文标题】在 csh 中,为啥 4 - 3 + 1 == 0?【英文标题】: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? 我实际上并没有使用它。这是我试图为朋友回答的问题。这是新的讨论:***.com/questions/1010119 只是为了增加轻浮性,在 tcsh(/bin/csh 通常是符号链接)中,4 - 3 + 1 的计算结果为 2 【参考方案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。

【讨论】:

以上是关于在 csh 中,为啥 4 - 3 + 1 == 0?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 torch.FloatTensor([[[0,1,2],[3,4,5]],[[6,7,8],[9,10,11]]]) 的大小是 [2,2, 3]? [关闭]

为啥 4 位多路复用器测试台代码给出 x?

为啥在 Racket 中以一种奇怪的方式定义 foldl?

为啥我的原始列表发生了变化?

为啥枚举权限经常有 0、1、2、4 个值?

为啥这个偶函数的 FFT 不是实数?