2016-02-07 2 views
5

Nei linguaggi di programmazione, se uso "\ n", aggiunge un carattere di nuova riga.Come " n", " t" aggiunge una nuova riga e scheda rispettivamente?

Qualcuno potrebbe spiegare come "\ n" viene tradotto in una nuova riga e lo stesso per "\ t"?

+4

Un po 'di [lettura] (https://en.wikipedia.org/wiki/String_literal#Escape_sequences) sarebbe di grande aiuto. – user1803551

+0

Cosa intendi con "dare", a che cosa si riferisce? Stai chiedendo come la sequenza letterale '" \ n "' diventa una nuova riga in una stringa costante? –

+0

Funziona solo con funzioni specifiche come 'printf'. Ogni volta che la funzione trova un carattere '\' con la 'format string' (di solito il primo parametro), sa che il * carattere successivo * dovrebbe essere un comando speciale, piuttosto che il carattere letterale. Inoltre, ** dovresti scegliere una risposta da quelli esistenti **, perché alcuni di essi svolgono un ottimo lavoro nel spiegare come funziona il processo. Non ignorare le persone che mettono il tempo per aiutarti a capire qualcosa. – mrDudePerson

risposta

5

Quando il compilatore legge il programma e vede backslash something sa "fingere" di vedere qualcos'altro. Si può immaginare che una parte del compilatore funziona così:

current_character = getNextCharacter(); 
if (current_character == BACKSLASH) { 
    current_character = getNextCharacter(); 
    if (current_character == 'n') { 
     /*oh, they want a newline */ 
    } else if (current_character == 't') { 
     /* it's a tab they want */ 
    } else /* ... and so on and so forth */ 
} 
+0

Qualche riferimento ?? –

+2

Un riferimento all'immaginazione di qualcuno? Un concetto curioso. In ogni caso, se vuoi conoscere i compilatori, questo sembra essere il libro www.amazon.com/Compilers-Principles-Techniques-Alfred-Aho/dp/0201100886 –

0

Il compilatore sa che quando vede \ n o \ t in una stringa, deve sostituirlo con qualcosa di speciale: una nuova riga o un carattere di tabulazione. Questo è solo convenzione, che il backslash seguito da un carattere speciale (n, l, t, ...) significa qualcosa di speciale.

Il motivo di questa convenzione è che negli editor di testo durante la scrittura del programma non è possibile incorporare caratteri di nuova riga e tabulazione nelle stringhe, in modo da aiutare il programmatore a sviluppare questa convenzione.

+4

È una funzionalità del linguaggio (almeno per quanto riguarda C e C++), non le funzioni della libreria. –

+0

@ jonathan-potter, hai ragione. Il compilatore trasforma questi speciali nei loro valori ascii, non nella libreria. Risolverò la mia risposta. –

+0

Non ASCII ma set di caratteri di destinazione e codifica della compilation. –

1

Il carattere \ è in molte lingue un "carattere di escape". Con quel personaggio puoi aggiungere speciali caratteri non stampabili, come nuova riga o tab, ma anche virgolette. Se è necessario utilizzare "per delimitare una stringa, è possibile utilizzare \" per stampare un segno di virgola al suo interno.

per il prompt dei comandi di Windows,^funziona in modo simile per la stampa di caratteri speciali.

2

Supponendo si parla di stringhe all'interno del linguaggio, come ad esempio "Hello,\tWorld\n", allora è il lavoro compilatori per rilevare un backslash, e quindi inserire la sequenza di caratteri appropriato per newline e scheda su quella macchina nella stringa nel file eseguibile generato.

Il codice per affrontare questo nel compilatore è abbastanza complessa, perché non v'è una quantità enorme di altre cose da tenere a mente durante l'analisi del codice, ma se semplifichiamo un po ':

if (inQuote) // So inside ' or " 
{ 
    if (currentChar == '\') 
    { 
     switch(nextChar) 
     { 
      case 'n': 
       InsertNewLine(); 
       break; 
      case 't': 
       InsertTab(); 
       break; 
      case 'b': 
       InsertBackSpace(); 
       break; 
      ... several more of these ... 
      case '\':   // '\\' outputs one '\' 
       InsertBackSlash(); 
       break; 
      default: 
       Insert(nextChar); // Ignore any others. 
       break; 
     } 
    } 
} 

Ho imbrogliato e creato funzioni per InsertXX, dove in realtà è probabilmente solo un *output++ = 10; o *output++ = 9; [o una costante definita che si traduce nello stesso].

0

Il carattere di nuova riga è una "sequenza di escape", così chiamata, perché il simbolo di barra retroversa è considerato un carattere di escape: provoca una fuga dalla normale interpretazione di una stringa, in modo che il carattere successivo venga riconosciuto come uno con una significato speciale. Ad esempio,

  • \ n introduce una nuova linea.
  • \ t introduce una scheda.
  • \\ inserisce una barra retroversa
  • \ "inserisce una virgoletta doppia.
+0

Se questa è una citazione, fornire una citazione. In caso contrario, non utilizzare la formattazione delle quote per il testo che non è quotato. – EJP

0

Il compilatore memorizza le stringhe ("hello") come una raccolta di caratteri ('h', 'e', 'l', 'l', 'o'). E inoltre memorizza quei caratteri come numeri - che vengono quindi rappresentati come bit, ecc.

\n rappresenta un carattere anche se ho usato due caratteri per scriverlo. La traduzione da un carattere leggibile all'uomo al numero memorizzato passa attraverso un sistema standardizzato, come ASCII o Unicode.In ASCII la nuova riga è rappresentata dal numero decimale 10 (vedere http://www.asciitable.com/index/asciifull.gif). 'A' è 65, 'B' è 66 e così via. Ogni lettera minuscola ha il proprio numero distinto da quello maiuscolo, a partire da 97.

La riga nuova viene convertita in una nuova riga quando il carattere viene stampato. Ogni volta che un carattere speciale come \n appare in un System.out.print(), il programma chiede al terminale di produrre l'output desiderato, come ad es. saltando la riga successiva.

Il terminale delega ulteriormente questo al sistema operativo e infine alla scheda grafica per rendere effettivamente i pixel in movimento. Ogni parte ha una propria area di responsabilità, e ogni altra parte non ha alcuna comprensione di come le cose sono fatte internamente in quella zona. Solo che possono interfacciarsi tra loro e far accadere le cose.

Ricorda che la maggior parte dei sistemi di computer sono assemblati da un grande gruppo di persone. Pochissimi conoscono ogni aspetto di ciò che accade dietro le quinte. E la bellezza di tutto ciò è che non ne hanno bisogno!

+0

La newline è già una nuova riga dal momento in cui il compilatore traduce il '\ n. Tutto ciò che accade su runtime è determinato dalle definizioni ASCII o Unicode e non è più un problema. – EJP