Eu vi uma linha de C que fica assim:
!ErrorHasOccured() ??!??! HandleError();
Compilou corretamente e parece funcionar bem. Parece que está verificando se ocorreu um erro e, se houver, ele lida com isso. Mas não tenho muita certeza do que está realmente fazendo ou como está fazendo. Parece que o programador está tentando expressar seus sentimentos sobre erros.
Eu nunca vi o ??!??!
antes em nenhuma linguagem de programação e não consigo encontrar documentação para isso em nenhum lugar. (O Google não ajuda em termos de pesquisa como ??!??!
). O que faz e como o exemplo de código funciona?
!ErrorHasOccurred() ??!???! HandleError();
compilar? É isso??!
???
!
. Prova o ponto?ErrorHasOccured() && HandleError()
mim mesma. É também assim que Lua faz.Respostas:
??!
é um trigrafo que se traduz em|
. Então diz:que, devido a curto-circuito, é equivalente a:
Guru da semana (lida com C ++, mas relevante aqui), onde eu peguei isso.
Possível origem de trigramas ou como @DwB aponta nos comentários, é mais provável que o EBCDIC seja difícil (novamente). Essa discussão no quadro IBM developerWorks parece apoiar essa teoria.
Da ISO / IEC 9899: 1999 §5.2.1.1, nota de rodapé 12 (h / t @ Random832):
fonte
if (ErrorHasOccured()) HandleError()
. Felizmente, você normalmente só encontra esse idioma no código perl.ErrorHasOccurred() && HandleError();
Ou seja, se você está acostumado a fazer shell scripts. :)Bem, por que isso existe em geral é provavelmente diferente do que existe no seu exemplo.
Tudo começou meio século atrás com o redirecionamento dos terminais de comunicação impressa como interfaces de usuário do computador. Na era inicial do Unix e C, era o teletipo ASR-33.
Esse dispositivo era lento (10 cps), barulhento e feio, e sua exibição do conjunto de caracteres ASCII terminava em 0x5f; portanto, tinha (observe atentamente a foto) nenhuma das teclas:
Os trigramas foram definidos para corrigir um problema específico. A idéia era que os programas em C pudessem usar o subconjunto ASCII encontrado no ASR-33 e em outros ambientes sem os altos valores ASCII.
No entanto, as pessoas que escreviam o código C quase por definição possuíam equipamentos modernos, 1 pelo que acho: alguém se exibindo ou se divertindo, deixando uma espécie de ovo de Páscoa no código para você encontrar.
Com certeza funcionou, levou a uma pergunta SO muito popular.
Teletipo ASR-33
1. Por esse motivo, os trigrafs foram inventados pelo comitê ANSI, que se reuniu pela primeira vez após C se tornar um grande sucesso, de modo que nenhum código ou codificador C original os teria usado.
fonte
#
foi substituída por£
. Em outras regiões, talvez "ASCII" não tenha chaves etc.if (x || y) { a[i] = '\0'; }
parecer comif (x öö y) ä aÄiÅ = 'Ö0'; å
o conjunto de caracteres errado.É um C trigraph .
??!
é|
, assim??!??!
como o operador||
fonte
<iso646.h>
arquivo de cabeçalho.Como já foi dito,
??!??!
são essencialmente dois trigramas (??!
e??!
novamente) misturados que são substituídos - traduzidos para||
, ou seja, o OR lógico , pelo pré-processador.A tabela a seguir, contendo todos os trigramas, deve ajudar a desambiguar combinações alternativas de trigramas:
Fonte: C: Um Manual de Referência 5ª Edição
Assim, um trigrama que pareça
??(??)
eventualmente será mapeado para[]
,??(??)??(??)
será substituído[][]
e assim por diante, você entenderá.Como os trigrafs são substituídos durante o pré-processamento, você pode usar
cpp
para obter uma visão da saída, usando umtrigr.c
programa bobo :e processando-o com:
Você obterá uma saída do console de
Como você pode perceber, a opção
-trigraphs
deve ser especificada ou entãocpp
emitirá um aviso; isso indica como os trigramas são coisa do passado e não têm valor moderno além de confundir pessoas que possam esbarrar neles .Quanto à justificativa por trás da introdução dos trigramas, é melhor compreendida ao examinar a seção de histórico da ISO / IEC 646 :
(ênfase minha)
Portanto, em essência, alguns caracteres necessários (aqueles para os quais existe um trigrama) foram substituídos em certas variantes nacionais. Isso leva à representação alternativa usando trigramas compostos por caracteres que outras variantes ainda possuíam.
fonte