在 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]? [关闭]