2

Недавно я наткнулся на ошибку в Visual Studio 2008 (по крайней мере, я думаю, что это один).Visual Studio 2008: струнные литералы «?? -», «??», «?? =» corrupt

Когда я пытаюсь создать строки-литералы с двумя вопросительными знаками, за которыми следует другой символ, возникает нечто странное: эти три символа заменяются другим символом.

Примеры:

printf("??-"); --> ~ (hyphen) 
printf("??'"); -->^(circumflex) 
printf("??="); --> # (hash) 
printf("??)"); --> ] (square braket) 
printf("??("); --> [ (square braket) 
printf("??/"); --> \ (backslash) 
printf("??!"); --> | (pipe) 
printf("??%"); --> ?? (percent sign disappears) 

Кто-нибудь знает причину этой замены?

+0

Не уверен по причине, но 'printf (@" ?? - ");' должен работать. И я знаю, что вы ищете причины, кроме решений. Но просто указываю, что это помогает кому-то. –

+0

Я думаю, вы можете избежать этих замен, используя '\?' Вместо простого '?'. –

+0

Последнее - «нормальное» поведение - для 'printf'' '' '' '' '' '%%'' в строке формата. – molbdnilo

ответ

4

Это не ошибка, скорее похмелье истории. Они являются триггерами C - https://msdn.microsoft.com/en-us/library/bt0y4awe.aspx

Di/Tri-graph - это способ представления символов, которые были недоступны при создании языка. Они позволяют вводить символы в исходный код, чтобы у вас не было клавиши клавиатуры для представления.

Tri-graph Symbol 
??=  # 
??/  \ 
??'  ^
??(  [ 
??)  ] 
??!  | 
??<  { 
??>  } 
??-  ~ 

Проблема% просто обычная в printf, где вам нужно избежать% с%, если вы хотите ее увидеть. Это связано с тем, что% обычно является началом спецификатора формата.

+0

Никогда не слышал о «Tri-graph». Благодаря! –

+0

Полезным способом было бы расколоть Tri-graph после двух вопросительных знаков: 'printf (" ?? "" - ")'. Это определенно работает :) –

+0

Обычно вы можете отключить их в большинстве компиляторов. Это означает, что ваш код строго не соответствует стандарту, но редко кто-то на самом деле хочет di/trigraph в эти дни. – Joe