我创建了一个包含以下代码段的新项目:
char* strange = "(Strange??)";
cout << strange << endl;
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
(奇怪]
因此翻译'??)' - >']'
调试它显示我的char*字符串文字实际上是该值,它不是流转换.这显然不是我见过的元字符序列.某种Unicode或宽字符序列也许?我不这么认为......我试过禁用所有相关的项目设置无济于事.
有人有解释吗?
码:
#include <stdio.h>
int main(void)
{
??< puts("Hello Folks!"); ??>
}
Run Code Online (Sandbox Code Playgroud)
上述程序,当使用GCC 4.8.1编译-Wall和-std=c11,给出了以下警告:
source_file.c: In function ‘main’:
source_file.c:8:5: warning: trigraph ??< converted to { [-Wtrigraphs]
??< puts("Hello Folks!"); ??>
^
source_file.c:8:30: warning: trigraph ??> converted to } [-Wtrigraphs]
Run Code Online (Sandbox Code Playgroud)
但当我改变身体时main:
<% puts("Hello Folks!"); %>
Run Code Online (Sandbox Code Playgroud)
没有警告被抛出.
那么,为什么编译器在使用三字符时会发出警告,但在使用有向图时却没有?
当我以非常简单的方式编写以下行时,我发现了一个奇怪的输出:
码:
printf("LOL??!\n");
printf("LOL!!?\n");
Run Code Online (Sandbox Code Playgroud)
输出:

即使代码是在MBCS和UNICODE下编译的,也会发生这种情况.
输出因"?"的顺序而异.和"!"......
任何的想法?
我遇到了一些奇怪的代码.它甚至看起来都不像C,但令我惊讶的是它编译并在我的C编译器上运行.这是C语言的一些非标准扩展吗?如果是这样,它的原因是什么?
??=include <stdio.h>
int main()
??<
const char arr[] =
??<
0xF0 ??! 0x0F,
??-0x00,
0xAA ??' 0x55
??>;
for(int i=0; i<sizeof(arr)/sizeof(*arr); i++)
??<
printf("%X??/n", (unsigned char)arr??(i??));
??>
return 0;
??>
Run Code Online (Sandbox Code Playgroud)
输出:
FF
FF
FF
Run Code Online (Sandbox Code Playgroud) 我正在经历一些面试问题,我遇到了如下示例。我尝试了简单输入/输出以及一些逻辑的示例,它工作没有任何问题。
??=include <stdio.h>
int main(void)
??<
printf("Hello");
// Other code lines here
return 0;
??>
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,这没有任何编译问题,并且输出符合要求。
这里的“??=”、“??<”和“??>”有何意义?
在使用ASCII作为其字符集的C编译器上,字符文字的值'??<'将等于'{',即0x7B.什么将是字面的一个编译器,其字符集不值有一个{角色?
在字符串文字之外,编译器可以推断出??<应该具有与定义的开括号字符相同的含义,即使编译器字符集没有开括号字符.实际上,三字母的整个目的是允许使用可表示字符的序列来代替不可表示的字符.该规范要求三字符甚至在字符串文字中处理,然而,这令我感到困惑.如果编译器的字符集包含一个{字符,编译器可以允许'{'表示为'??<',但字符集包括{我看不出程序员不会简单地使用它.{但是,如果字符集不包含,这似乎是首先使用三字符串的唯一原因,编译器应该??<用什么可表示的字符代替?
c99 standard 5.2.1.1 Trigraph sequences
Run Code Online (Sandbox Code Playgroud)
2 示例以下源代码行
printf("Eh???/n");
Run Code Online (Sandbox Code Playgroud)
变成(在替换三字母序列之后??/)
printf("Eh?\n");
Run Code Online (Sandbox Code Playgroud)
据说它将替换三合字母序列,但事实并非如此。
正在打印 "Eh???/n"
我错过了什么吗?
已添加代码:
bool CHARACTER::SpamAllowBuf(const char *Message)
{
if (!strcmp(Message, "(??´c)") || !strcmp(Message, "(?·)") || !strcmp(Message, "(±a?Y)") || !strcmp(Message, "(AA??)") || !strcmp(Message, "(?c¶?)") || !strcmp(Message, "(???e)") || !strcmp(Message, "(??C?)") || !strcmp(Message, "(????)") || !strcmp(Message, "(AE??)"))
{
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
警告给出:
char.cpp:7254:121: warning: trigraph ??) ignored, use -trigraphs to enable
char.cpp:7254:245: warning: trigraph ??) ignored, use -trigraphs to enable
char.cpp:7254:275: warning: trigraph ??) ignored, use -trigraphs to enable
Run Code Online (Sandbox Code Playgroud)
我怎么能跳过这个警告?
考虑一下这个无害的C++程序:
#include <iostream>
int main() {
std::cout << "(Is this a trigraph??)" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我使用g ++版本5.4.0编译它时,我得到以下诊断:
me@my-laptop:~/code/C++$ g++ -c test_trigraph.cpp
test_trigraph.cpp:4:36: warning: trigraph ??) ignored, use -trigraphs to enable [-Wtrigraphs]
std::cout << "(Is this a trigraph??)" << std::endl;
^
Run Code Online (Sandbox Code Playgroud)
程序运行,其输出符合预期:
(Is this a trigraph??)
Run Code Online (Sandbox Code Playgroud)
为什么要为三字符分析字符串文字呢?
其他编译器也这样做吗?