_did_ C运算符/ \和\ /做什么?

时间:2009-10-08 22:34:04

标签: c compiler-construction operators history algol

任何人都可以在C中“声明”自己的运算符....也就是说,如果一个人是C编译器大师并拥有C编译器的源代码! ; - )

需要解决的其他问题:

  1. 这些操作是如何完成的 C99? GCC? ...
  2. 为什么/ \& \ /掉线?
  3. / \和\ /运算符对哪些类型有效?
  4. Google搜索“/ \ \ /”自然不会返回任何内容。维基百科的页面既不是/ \也不是\ /。但我发现表格类似的运算符内置于XML字符实体中!


    来源添加:我在PDP的cc源文件“c00.c”中找到了令人讨厌的例子:

    /*
     * Return the next symbol from the input.
     * peeksym is a pushed-back symbol, peekc is a pushed-back
     * character (after peeksym).
     * mosflg means that the next symbol, if an identifier,
     * is a member of structure or a structure tag or an enum tag
     */
    symbol()
    {
    ...
     case BSLASH:
      if (subseq('/', 0, 1))
       return(MAX);
      goto unkn;
    
     case DIVIDE:
      if (subseq('\\', 0, 1))
       return(MIN);
      if (subseq('*',1,0))
       return(DIVIDE);
    ...
    }
    


    实际实施: / \和\ /运算符的历史可以追溯到1975年Sixth Edition Unix(到目前为止)。示例:Unix V6(1975),Unix V7(1979)和更多BSD 2.11(1992 - 2008

8 个答案:

答案 0 :(得分:18)

ISO C89标准中没有/ \或/被定义为运算符,我认为它们在任何早期版本中都没有定义过。据我所知,它们在C99中肯定没有定义。

这是ANSI C89标准的草案,供参考:http://flash-gordon.me.uk/ansi.c.txt

(你可能是一些奇怪的奥术预处理魔法的受害者)

答案 1 :(得分:14)

\/看起来像sup/\看起来像inf。它们也可能是和 分别为

我不记得在K& R第二版或任何其他C书中看过这些。

答案 2 :(得分:10)

投机!

如果你周围有空格,那么:

a /\ b   ===>   a / b

a \/ b   ===>   a / b

逻辑:预处理阶段必须处理反斜杠和后面的字符,并且很可能将反斜杠空格视为空格,反斜杠斜杠视为斜线。

也就是说,SUN C编译器(版本12)和GNU C编译器(版本4.4)都拒绝包含反斜杠的代码。但我可以很容易地相信旧的,预标准的C预处理器不那么小心。

符合标准

运营商从未参与过C的官方版本。

此外,该标准不允许我给出的解释(第5.1.1.2节翻译阶段,在C89和C99中) - 但非标准编译器当然不受标准约束。


在发布消息来源后添加:

有趣!因此,“a = b /\ c;”将b和c的最大值分配给a,并将“a = b \/ c;”分配给最小值(或者正如Greg Hewgill指出的那样,反之亦然),这似乎是合理的。而且,在那些日子里,现代的“+=”运算符很可能仍被写成'=+'并且实际上是两个令牌没有支持这个断言的证据;再次失去记忆),所以假设的“a =/\ b;”(或者,在现代符号中,“a /\= b;”)将是最大赋值运算符等。

在我看来,汤普森的ACM图灵奖演讲“Reflections On Trusting Trust”在某种程度上是相关的。

答案 3 :(得分:6)

我不确定\/,但/\是有效的构造。它用于将单行注释的两个斜杠放在单独的行上。例如:

/\
/ Comment content

这是有效的,因为反斜杠字符会转义换行符,并且解析器会继续,就好像它不存在一样。如果反斜杠后面有空格或第二个正斜杠缩进,则无效。因此,可以像在

中那样转义任意数量的换行符
/\
\
\
\
\
/ Still a legal comment.

反斜杠也可以在常规单行注释的末尾使用,以使它们继续到下一行,如

// Yet another comment \
This line is in the comment \\
And so is this one!

答案 4 :(得分:3)

C从未有过这些运营商。

通常/将是某些字符串系统中的转义码,不确定/ \是否有任何意义。

答案 5 :(得分:3)

我怀疑他们有没有意义。如果他们曾经做过,那是很长时间之前。我所知道的唯一主要的运算符是从C中删除的= +和= - ,它们是+ =和 - =的早期同义词。您可能希望查看DMR的Primeval C Page作为证据。

答案 6 :(得分:3)

我猜这些是对形式符号逻辑的引用:

http://en.wikipedia.org/wiki/Table_of_logic_symbols

/用于表示析取(OR) / \用于(不太频繁)表示连接(AND)

答案 7 :(得分:1)

Caret(^)执行按位异或。

我不相信有“V”运算符。这就是字母'V'(或看起来很像它的东西)。有人可能想要命名一个变量。