C运营商/ \和\ /做了什么?
任何人都可以在C语言中“声明”自己的操作符,也就是说,如果一个人是C编译器大师,并且拥有C编译器的源代码! 😉
更多的疑问来解谜:
- 这些操作在C99中是如何完成的? GCC? …
- 为什么被丢弃?
- / \和\ /运算符有效的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。