C运营商/ \和\ /做了什么?

任何人都可以在C语言中“声明”自己的操作符,也就是说,如果一个人是C编译器大师,并且拥有C编译器的源代码! 😉

更多的疑问来解谜:

  1. 这些操作在C99中是如何完成的? GCC? …
  2. 为什么被丢弃?
  3. / \和\ /运算符有效的types是什么?

谷歌search“/ \ \ /”自然没有返回。 维基百科的页面既不是/ \也不是\ /。 但是我发现forms类似的操作符都是内置到XML字符实体中的!


Source补充说:我在PDP的cc源文件“c00.c”中find了这个有问题的例子:

/* * 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); ... } 

实际的实现: / \和\ /运营商可以追溯到第六版Unix 1975(到目前为止)。 例如: Unix V6 (1975), Unix V7 (1979)以及更多的BSD 2.11 (1992-2008)

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

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

在ISO C89标准中既不/也不被定义为运算符,我不认为它们曾经在任何早期版本中定义过。 就我所知,它们在C99中绝对没有定义。

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

(你可能是一些奇怪的神秘的预处理器魔法的受害者)

炒作!

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

 a /\ b ===> a / b a \/ b ===> a / b 

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

也就是说,SUN C编译器(版本12)和GNU C编译器(版本4.4)均拒绝包含反斜杠的代码。 但是我可以轻易地相信旧的,预标准的C预处理器不太注意它。

遵守标准

运营商从来都不是C的官方版本的一部分

而且,这个标准不允许我给出的解释(C89和C99中的第5.1.1.2节翻译阶段) – 但是非标准的编译器当然不受标准的约束。


添加源后发布:

有趣! 所以看起来似乎是合理的' a = b /\ c; '把b和c的最大值分配给a,' a = b \/ c; “要做到最低限度(或者像Greg Hewgill指出的那样,反之亦然)。 而在那个时代,现代的“ += ”运算符可能仍然写成“ =+,实际上是两个记号这个断言没有支持的证据;再次失败的记忆 ),所以假设的“ a =/\ b; '(或者在现代符号中,' a /\= b; ')应该是最大赋值运算符等等。

Thompson的ACM图灵奖演讲“ 信任信任的思考 ”在某种程度上也是相关的。

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

 /\ / Comment content 

这是有效的,因为反斜杠字符转义换行符,parsing器继续,就好像它不在那里一样。 如果反斜杠之后有空格,或者第二个斜杠缩进,这将不起作用。 正因为如此,如你所愿,有可能逃脱尽可能多的换行符

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

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

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

C从来没有这些运营商。

通常/会是一些string系统中的转义码,不确定/ \曾经有过任何意义。

我怀疑他们是否有任何意义。 如果他们曾经这样做过,那是很久以前的事了。 我所知道的唯一主要的操作符已经从C中移除了= +和= – ,它们是+ =和 – =的早期同义词。 你可能想看看DMR的原始C页面的证据。

我会猜测这些是对forms象征逻辑的引用:

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

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

脱字符( ^ )执行一个按位独占或。

我不相信有一个“V”运营商。 这是字母“V”(或者看起来像是一个很大的东西)。 有人可能想要命名一个variables。