C++
Ola mundo


A mellor maneira de comezar a aprendizaxe de C++ é co seguinte programiña:

// Pequeno programa que imprime a mensaxe «Ola mundo!».
#include <iostream>

int main()
{
  std::cout << "Ola mundo!" << std::endl;
  return 0;
}

Malia a simplicidade do programa, cómpre que antes de continuar a aprendizaxe da linguaxe, compile e execute o programa. Debería imprimir no terminal dende o que o execute o seguinte texto:

Ola mundo!

Se ten algún problema para compilalo, consúlteo con calquera programador de C++. Pode mesmo empregar a páxina de discusión deste capítulo. A continuación explicarase parte por parte o programa.

O comentario

editar

A primeira liña do programa contén o seguinte:

// Pequeno programa que imprime a mensaxe «Ola mundo!».

Os caracteres // indican o comezo dun comentario, que afecta a todo o que conteña a liña á dereita deles. Os comentarios son ignorados polo compilador, e o seu propósito consiste en permitirlle ao programador explicar o código para que outros programadores poidan comprendelo con maior facilidade.

O #include

editar

En C++, moitas das funcionalidades fundamentais, como a entrada e saída de datos, forman parte da biblioteca estándar, non do núcleo da linguaxe. Isto resulta importante porque o núcleo da linguaxe está dispoñible para todos os programas de C++, pero hai que indicar as partes da biblioteca estándar que se queren empregar .

Os programas solicitan funcionalidades da biblioteca estándar mediante directrices #include. Estas adoitan listarse ao principio do programa. O noso programa só emprega a parte da biblioteca estándar correspondente á entrada e saída de datos, que solicitamos mediante a seguinte liña de código:

#include <iostream>

O nome «iostream» fai referencia á entrada e saída secuencial ou de fluxo (stream), en contraposición a outras partes da biblioteca coma o acceso aleatorio ou a entrada e saída gráfica. Como «iostream» aparece na directriz #include e vai entre os caracteres «<» e «>», fai referencia a unha parte da biblioteca estándar chamada “cabeceira estándar” (standard header). Incluír a cabeceira estándar pon as funcionalidades das bibliotecas asociadas a disposición do programa.

A función principal

editar

Unha función é un anaco de programa que ten nome, e que outra parte do programa pode chamar, facendo que se execute. Todo programa en C++ debe conter unha función chamada «main». Ao executarse o programa, será esta a función que se execute.

A función principal ten que devolver un valor enteiro. Este valor indicará se o programa se executou correctamente ou, de haber algún erro, para indicar o tipo de erro.

Por iso, comezamos a parte executable do programa coa seguinte liña de código:

int main()

Con isto indicamos que estamos a definir unha función chamada «main» que devolve un valor de tipo «int». «int» é a palabra que emprega o núcleo da linguaxe para facer referencia aos números enteiros. A parella de parénteses a continuación de «main» contén a lista de parámetros que a función recibe. Neste exemplo concreto, a función non recibe ningún parámetro. Porén, a función principal pode recibir parámetros, como se verá máis adiante.

As chaves

editar

A definición da función principal continúa seguindo aos parénteses unha secuencia de sentenzas delimitadas por unha parella de chaves.

int main()
{	// Chave inicial.
	// Sentenzas.
}	// Chave final.

En C++, as chaves indican que o que vaia entre elas debe tratarse coma unha unidade. No noso exemplo, a chave inicial indica o inicio da función principal e a final indica, evidentemente, o seu final. Noutras palabras, as chaves indican que todo o que vai entre elas forma parte da mesma función.

Cando hai dous ou máis sentenzas entre as chaves, estas executaranse na orde en que aparecen.

Empregando a biblioteca estándar para a saída de datos

editar

A primeira liña de código do programa é a que fai o verdadeiro traballo:

std::cout << "Ola mundo!" << std::endl;

Esta sentenza emprega o operador estándar de saída, «<<», para escribir «Ola mundo!» na saída estándar, e logo o valor de «std::endl».

Prefixar un nome con «std::» indica que o nome forma parte do espazo «std». Un espazo é unha colección de nomes relacionados entre si. A biblioteca estándar emprega «std» para conter todos os nomes que define. Por exemplo, a cabeceira estándar de «iostream» define os nomes «cout» e «endl», e facemos referencia a eles como «std::cout» e «std::endl».

O nome «std::cout» fai referencia ao fluxo de saída estándar, que será o que o sistema poña a disposición do programa para imprimir os datos de saída ordinarios do programa. Por exemplo, se o programa se executa dende un terminal, o propio terminal será a saída estándar.

Escribir o valor de «std::endl» remata a liña actual de saída, de xeito que se o programa volve escribir algo máis na saída estándar, estes novos datos aparecerían nunha nova liña.

O return

editar

A sentenza de devolución pon fin á execución da función na que aparece, e pásalle o valor entre a palabra clave «return» e o punto e coma («;») á función que chamou á función da que se executa a sentenza. O tipo de dato devolto debe ir acorde ao que a función indica que vai devolver na súa definición.

No caso da función principal, o tipo de devolución é «int», e a función que a chamou é o propio sistema operativo. Polo tanto, a sentenza de devolución da función principal debe incluír un valor enteiro, que se lle devolverá ao sistema.

Por suposto, pode que haxa varias partes dunha función nas que cómpre rematar a execución do programa. Un programa pode ter para iso varias sentenzas de devolución. Pero todas elas deben devolver un valor do tipo definido para a función na que aparecen.

Afondando

editar

No programa reflíctense dous conceptos adicionais de C++: expresións e ámbito. Se ben non fai falla afondar nestes conceptos, si que cómpre introducilos.

As expresións

editar

As expresións requiren que se procese algo. O procesamento remata cun resultado, e pode ter ademais efectos colaterais —podería afectar ao estado do programa de modos que non teñen por que estar directamente ligados ao resultado—. Por exemplo, «3+4» é unha expresión cuxo resultado é «7», e que non ten efectos colaterais. Por outra banda, a seguinte liña de código (que empregamos no programa) é unha expresión que ten como efecto colateral que se imprima en pantalla o texto «Ola mundo!» e un salto de liña:

std::cout << "Ola mundo!" << std::endl;

As expresións conteñen operadores e operandos, e ambos os dous poden ter diversas formas. Na expresión anterior, «<<» é un operador, e «std::cout», «"Ola mundo!"» e «std::endl» son operandos.

Todo operando ten un tipo. Un tipo consiste basicamente nunha estrutura de datos e mailos operadores que cobran sentido para esa estrutura. O efecto dun operador depende do tipo dos operandos.

Os tipos adoitan ter nome. Por exemplo, o núcleo da linguaxe define «int» como o nome do tipo que representa enteiros, e a biblioteca define «std::ostream» como o tipo que fornece saída en fluxo. No programa, «std::cout» é do tipo «std::ostream».

O operador «<<» precisa de dous operandos, pero no programa empregamos dous operadores e tres operandos. Como? A resposta é que «<<» é asociativo pola esquerda, o que en poucas palabras significa que cando aparece varias veces nunha mesma expresión, cada «<<» empregará canto poida do seu operando pola esquerda, e o mínimo do seu operando pola dereita. No noso programa, o primeiro operador «<<» ten «"Ola mundo!"» como operando pola dereita e «std::cout» como operando pola esquerda, e o segundo operador «<<» ten «std::endl» como o seu operando pola dereita e «std::cout << "Ola mundo!"» como o seu operando pola esquerda.

Pero isto podémolo clarificar facilmente. A seguinte sentenza é equivalente á anterior, pero con parénteses para facer máis evidente a prioridade de procesamento.

( std::cout << "Ola mundo!" ) << std::endl;

Cada «<<» se comporta dun xeito dependendo do tipo de dato dos seus operandos. O primeiro «<<» ten como operando pola esquerda «std::cout», de tipo «std::ostream». O seu operando pola dereita é unha cadea de texto literal, cuxo tipo de dato non discutiremos agora. Con eses tipos de dato nos seus operandos, «<<» escribe os caracteres do seu operando pola dereita no fluxo ao que fai referencia o seu operando pola esquerda, e o seu resultado é o seu operando pola esquerda.

É dicir, despois de executarse a liña anterior, é como se a expresión quedase coa seguinte forma:

std::cout << std::endl;

O operando pola esquerda do segundo «<<» é unha expresión que devolve «std::cout», que ten por tipo «std::ostream». O operando pola dereita é «std::endl», que é un manipulador. A propiedade clave dos manipuladores é que escribir un nun fluxo manipula o fluxo, facendo algo distinto a escribir nel un carácter. Cando o operador pola esquerda de «<<» é de tipo «std::ostream» e o operador pola dereita é un manipulador, «<<» faille ao fluxo o que diga o manipulador, e devolve o fluxo como resultado. No caso de «std::endl», a acción consiste en poñerlle fin á liña actual de saída.

Polo tanto, a expresión (toda ela) ten por resultado «std::cout» e, como efecto colateral, escribe «Ola mundo!» no fluxo de saída estándar e ponlle fin á liña de saída. Logo, ao escribir un punto e coma («;») a continuación da expresión, estamos dicindo que o valor devolto pode descartarse, dado que no que estabamos interesados era nos seus efectos colaterais.

Os ámbitos

editar

O ámbito dun nome é a parte do programa na que ese nome ten significado. C++ ten moitos tipos distintos de ámbitos, e neste programa vimos dous deles.

O primeiro ámbito que empregamos foi un espazo, que como xa dixemos consiste nun conxunto de nomes relacionados entre si. A biblioteca estándar define todos os seus nomes no espazo «std», para evitar conflitos con nomes definidos por nós —sempre e cando non sexamos tan parvos como para definir «std»—. Ao empregarmos un nome da biblioteca estándar, debemos indicar que o nome que queremos é o da biblioteca. Por exemplo, «std::cout» significa «o nome “cout” que está no ámbito (espazo) “std”».

As chaves son outro tipo de ámbito. O corpo da función principal, así coma o de calquera outra función, é un ámbito en si mesmo. Este feito non resulta relevante para un programa tan pequeno coma este, pero resultará fundamental con programas de maior magnitude.


C++
Ola mundo