C++ 暗线“?!”&引用;在遗留代码中
我正在重构一些非常旧的遗留代码,这些代码充满了bug和非常可疑的实践,至少对于现代标准来说是如此。现在我遇到了一条我根本无法理解的线:C++ 暗线“?!”&引用;在遗留代码中,c++,c,operators,C++,C,Operators,我正在重构一些非常旧的遗留代码,这些代码充满了bug和非常可疑的实践,至少对于现代标准来说是如此。现在我遇到了一条我根本无法理解的线: p和k属于int* return p??!??!k?p?*p:sizeof(*k):0; 当我看到它时,我简直不敢相信自己的眼睛——我知道?操作符,但它的语法是bool?trueresult:falseresult和一个??操作符都没有意义(惰性计算在这里并不适用),我在任何地方都找不到该神秘操作符的引用 如果有人能解释一下这件事,那就太酷了。这叫: C11(
p
和k
属于int*
return p??!??!k?p?*p:sizeof(*k):0;
当我看到它时,我简直不敢相信自己的眼睛——我知道?
操作符,但它的语法是bool?trueresult:falseresult
和一个??
操作符都没有意义(惰性计算在这里并不适用),我在任何地方都找不到该神秘操作符的引用
如果有人能解释一下这件事,那就太酷了。这叫:
C11(ISO/IEC 9899:201x)§5.2.1.1三角图序列
在进行任何其他处理之前,每次出现下列情况之一
三个字符的序列(称为trigraph sequences17)替换为
对应的单个字符
由于三元运算符的优先级较低,它实际上是:
return (p || k) ? (p ? (*p) : sizeof(*k)) : 0;
该代码行相当于:
return p || k? p? *p : sizeof(*k) : 0;
或者更清楚地说:
return (p || k)? (p? (*p) : sizeof(*k)) : 0;
您使用的是哪种编译器?例如,gcc默认情况下忽略三角图。是的,这肯定是非常非常旧的代码,的确。@devnull它是gcc,但它是用Makefile编译的。现在我知道了trigraphs是什么,我也知道了为什么会有一个
-trigraphs
标志传递给编译器;)三角图(??!
)是邪恶的;链式三元运算符(?:
)也是邪恶的;把它们混在一条线上太多了!这纯粹是垃圾。我现在将重复问题添加到这里的评论。
return p || k? p? *p : sizeof(*k) : 0;
return (p || k)? (p? (*p) : sizeof(*k)) : 0;