我看到一行C看起来像这样:
!ErrorHasOccured() ??!??! HandleError();
Run Code Online (Sandbox Code Playgroud)
它编译正确,似乎运行正常.看起来它正在检查是否发生了错误,如果有错误,它会处理它.但我不确定它在做什么或它是如何做的.看起来程序员正试图表达他们对错误的看法.
我从来没有??!??!在任何编程语言中看过以前,我无法在任何地方找到它的文档.(Google对搜索字词没有帮助??!??!).它做了什么以及代码示例如何工作?
根据C++'03标准2.3/1:
在进行任何其他处理之前,每个出现的以下三个字符序列之一("三字符序列")被表1中指示的单个字符替换.
Run Code Online (Sandbox Code Playgroud)---------------------------------------------------------------------------- | trigraph | replacement | trigraph | replacement | trigraph | replacement | ---------------------------------------------------------------------------- | ??= | # | ??( | [ | ??< | { | | ??/ | \ | ??) | ] | ??> | } | | ??’ | ˆ | ??! | | | ??- | ˜ | ----------------------------------------------------------------------------
在现实生活中,这意味着代码printf( "What??!\n" );将导致打印,What|因为??!是一个被|字符替换的三字符序列.
我的问题是使用三字母的目的是什么?使用三字母有什么实际优势吗?
UPD:在答案中提到一些欧洲键盘没有所有标点字符,所以非美国程序员必须在日常生活中使用三字母组合?
UPD2:Visual Studio 2010默认情况下关闭了三字母支持.
我从一些遗留代码中看到了以下代码:
size_t a = 1 ???- 2 :0;
Run Code Online (Sandbox Code Playgroud)
符号???-在C++ 中的含义是什么?我该怎么理解呢?
谢谢!
我正在查看c ++中字符串中字符的转义序列,我注意到有一个问号的转义序列.谁能告诉我为什么会这样?这看起来有点奇怪,我无法弄清楚是什么?做一个字符串.谢谢.
我有一些(遗留)代码,我第一次使用clang构建.代码类似于:
sprintf(buf, "%s <%s ????>", p1, p2);
Run Code Online (Sandbox Code Playgroud)
Clang发出以下警告(错误-Werror):
test.c:6:33: error: trigraph converted to '}' character [-Werror,-Wtrigraphs]
sprintf(buf, "%s <%s ????>", p1, p2);
^
Run Code Online (Sandbox Code Playgroud)
显然,这??>不是一个三元组,所以我想完全禁用三元组(源不会故意在任何地方使用它们).
我试过了,-no-trigraphs但这不是一个真正的选择:
clang: warning: argument unused during compilation: '-no-trigraphs'
Run Code Online (Sandbox Code Playgroud)
我可以关闭三元组警告,-Wno-trigraphs但我不希望实际发生三元组转换.
注意:Trigraphs被启用为使用的意外副作用-std=c89.
如果数据流中有趣的数据,我正在尝试匹配一些块.
应该有一个前导的<四个字母数字字符,两个校验和字符(或者??如果没有指定shecksum)和一个尾随字符>.
如果最后两个字符是字母数字,则以下代码按预期工作.如果他们??失败了.
// Set up a pre-populated data buffer as an example
std::string haystack = "Fli<data??>bble";
// Set up the regex
static const boost::regex e("<\\w{4}.{2}>");
std::string::const_iterator start, end;
start = haystack.begin();
end = haystack.end();
boost::match_flag_type flags = boost::match_default;
// Try and find something of interest in the buffer
boost::match_results<std::string::const_iterator> what;
bool succeeded = regex_search(start, end, what, e, flags); // <-- returns false
Run Code Online (Sandbox Code Playgroud)
我没有在文档中发现任何暗示应该是这种情况的东西(除了NULL和换行符应该匹配AIUI).
那么我错过了什么?