Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 暗线“?!”&引用;在遗留代码中_C++_C_Operators - Fatal编程技术网

C++ 暗线“?!”&引用;在遗留代码中

C++ 暗线“?!”&引用;在遗留代码中,c++,c,operators,C++,C,Operators,我正在重构一些非常旧的遗留代码,这些代码充满了bug和非常可疑的实践,至少对于现代标准来说是如此。现在我遇到了一条我根本无法理解的线: p和k属于int* return p??!??!k?p?*p:sizeof(*k):0; 当我看到它时,我简直不敢相信自己的眼睛——我知道?操作符,但它的语法是bool?trueresult:falseresult和一个??操作符都没有意义(惰性计算在这里并不适用),我在任何地方都找不到该神秘操作符的引用 如果有人能解释一下这件事,那就太酷了。这叫: C11(

我正在重构一些非常旧的遗留代码,这些代码充满了bug和非常可疑的实践,至少对于现代标准来说是如此。现在我遇到了一条我根本无法理解的线:

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;