34

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

进一步的难题:

  1. 这些操作在 C99 中是如何完成的?海合会?...
  2. 为什么 /\ & \/ 被丢弃了?
  3. /\ 和 \/ 运算符对哪些类型有效?

谷歌搜索“/\ \/”自然不会返回任何内容。维基百科的页面既不是 /\ 也不是 \/。但我发现 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 年的第六版 Unix(到目前为止)。示例:Unix V6 (1975)、Unix V7 (1979) 和更多当前的BSD 2.11 ( 1992-2008 )

4

8 回答 8

18

/\ 和 / 都没有被定义为 ISO C89 标准中的运算符,而且我认为它们从未在任何早期版本中定义过。据我所知,它们绝对没有在 C99 中定义。

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

(你可能是某种奇怪的奥术预处理器魔法的受害者)

于 2009-10-08T22:41:06.157 回答
14

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

我不记得曾经在 K&R 第 2 版或任何其他 C 书籍中看到过这些。

于 2009-10-08T22:53:04.943 回答
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;' (或者,在现代notation, ' a /\= b;') 将是最大赋值运算符等。

我还想到汤普森的 ACM 图灵奖演讲“对信任的反思”在某种程度上是相关的。

于 2009-10-08T22:48:58.660 回答
6

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

/\
/ Comment content

这是有效的,因为反斜杠字符转义了换行符,并且解析器继续运行,就好像它不存在一样。如果反斜杠后有空格或第二个正斜杠缩进,这将不起作用。因此,可以尽可能多地转义换行符,如

/\
\
\
\
\
/ Still a legal comment.

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

// Yet another comment \
This line is in the comment \\
And so is this one!
于 2009-10-08T23:05:29.490 回答
3

C 从未有过这些运算符。

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

于 2009-10-08T22:43:38.743 回答
3

我怀疑他们曾经意味着什么。如果他们曾经这样做过,那是很久以前的事了。我所知道的唯一从 C 中删除的主要运算符是 =+ 和 =-,它们是 += 和 -= 的早期同义词。您可能想查看 DMR 的原始 C 页面以获取证据。

于 2009-10-08T22:50:33.713 回答
3

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

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

/ 用于表示析取(OR) /\ 用于(较少)表示合取(AND)

于 2009-10-08T23:58:13.887 回答
1

Caret ( ^) 执行按位异或。

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

于 2009-10-08T22:47:57.257 回答