sintaxis programar programacion libro lenguajes lenguaje ejemplos como comandos basicos c++ python syntax

programar - ¿Por qué es tan complicada la sintaxis de C++?



lenguajes de programacion (10)

... tienes que incluir el cada vez? ¿Alguna vez no lo necesitas?

No lo necesita si no va a utilizar iostreams en ese módulo. En programas más grandes, pocos módulos hacen IO real directamente, y muy pocos realmente necesitan usar iostreams.

Cambiando la pregunta: en Python, debe importar sys y / o os en la mayoría de los programas no triviales. ¿Por qué?

... la misma pregunta para la biblioteca estándar, ¿cuándo no necesita std :: *?

Puede tener la línea que usa o puede usar el prefijo std ::. Esto es muy similar a la opción que Python le da para decir "from sys import *" o "import sys" y luego tener que prefijar las cosas con "sys". En Python tienes que decir "sys.stdout". ¿Es "std :: cout" realmente peor?

... es la parte "principal" una función? ¿Alguna vez has llamado a la función principal? ¿Por qué es un número entero? ¿Por qué C ++ necesita tener una función principal pero Python no?

Sí, main es una función. Típicamente no llamarías principal a ti mismo. El nombre "principal" está reservado para el punto de entrada de su programa. Devuelve un entero porque el valor devuelto se utiliza como el código de estado de su programa. En Python, puede usar sys.exit si desea devolver un código de estado distinto de cero.

Python no tiene la misma convención porque con Python puede tener código en un módulo que no en una función. Este código se ejecuta cuando carga el módulo. Curiosamente, muchas personas sienten que es un estilo malo tener código en el nivel superior de un módulo y en su lugar crearán una función principal al hacer algo como esto:

def main(argv): # program goes here return 0 if __name__ == ''__main__'': sys.exit(main(sys.argv))

Además, en Python, el intérprete con módulo es el módulo "principal" cuando lo ejecutas. Por ejemplo: "python foo.py". En C, el módulo "principal" es (efectivamente) el que tiene una función llamada principal. (Si hay varios módulos con una función principal, es un error de vinculador).

... necesitas "std :: cout <<"? ¿No es eso innecesariamente largo y complicado en comparación con Python?

El equivalente en Python es en realidad "sys.stdout.write (...)". La declaración de impresión de Python es una mano corta de casos especiales.

Dicho esto, muchas personas sienten que la convención de iostreams de usar operadores de cambio de bits para IO fue una mala idea. Irónicamente, Python parece haber sido "inspirado" por esta sintaxis. Si desea utilizar imprimir para escribir en otro lugar que no sea stdout, puede decir:

print >>file, "Hello"

... ¿necesita devolver 0 incluso cuando nunca lo va a usar?

No lo vas a usar, pero tu programa lo hará. Como se mencionó anteriormente, el valor que devuelve es el código de estado de su programa.

Aparte: en realidad creo que C ++ es una complicación excesiva, pero no por ninguno de los puntos que mencionas. Todas las diferencias que menciona desaparecen (en el sentido de que necesita tanta complejidad en Python) una vez que comienza a escribir programas no triviales que tienen varios módulos y hacen más que simplemente escribir en stdout.

Soy un novato en la programación, aunque he estado aprendiendo Python por un año y estudié C # hace algún tiempo.

Este mes comencé cursos de programación en C ++ en mi universidad y solo tengo que preguntar; "¿Por qué el código C ++ es tan complicado?"

Escribiendo "Hola mundo". en Python es tan simple como "imprimir ''Hola mundo'' '', pero en C ++ es:

# include <iostream> using namespace std; int main () { cout << "Hello world."; return 0; }

Sé que probablemente haya una buena razón para todo esto pero, por qué ...

  • ... ¿tienes que incluir el <iostream> cada vez? ¿Alguna vez no lo necesitas?
  • ... la misma pregunta para la biblioteca estándar, ¿cuándo no necesita std :: *?
  • ... es la parte "principal" una función? ¿Alguna vez has llamado a la función principal? ¿Por qué es un número entero? ¿Por qué C ++ necesita tener una función principal pero Python no?
  • ... necesitas "std :: cout <<"? ¿No es eso innecesariamente largo y complicado en comparación con Python?
  • ... ¿necesita devolver 0 incluso cuando nunca lo va a usar?

Probablemente esto se deba a que estoy aprendiendo C ++ básico, pero todos los programas que he creado hasta ahora se parecen a esto, por lo que tengo que volver a escribir el mismo código una y otra vez. ¿No es eso redundante? El compilador no pudo ingresar este código, ya que siempre es el mismo (es decir, afaik siempre incluye <iostream>, std, int main, return 0)


Baldur:

No siempre necesitas <iostream> . Las únicas cosas que siempre necesitarás son:

  1. Una función main (o un WinMain , si está escribiendo aplicaciones Win32).
  2. Variables, funciones, operadores, construcciones de lenguaje ( if , while , etc.).
  3. La capacidad de incluir la funcionalidad de las bibliotecas en su programa.

Todo lo demás es específico de la aplicación.

Como dicen otros carteles, el valor de retorno de la función main es un código de error 1 . Si el retorno main 0, se feliz: todo funcionó bien!

1 Esto es útil cuando escribe programas que se "comunican" con otros programas. La forma más sencilla en que un programa puede "decirle" a otro si se ejecutó correctamente es usando un código de error.


C ++ es un lenguaje de más bajo nivel que se ejecuta sin el contexto de un intérprete. Como tal, tiene muchas opciones de diseño diferentes a las de Python, porque C ++ no tiene un entorno en el que pueda confiar para administrar información como los tipos y la memoria. C ++ se puede usar para escribir un kernel de sistema operativo donde no se ejecuta ningún código en la máquina, excepto el programa, lo que significa que el idioma (algunas instalaciones de biblioteca no están disponibles para las llamadas implementaciones independientes) debe ser autónomo. Esta es la razón por la que C ++ no tiene equivalente a la eval de Python, ni un medio para determinar miembros, etc. de una clase, ni otras características que requieren un entorno de ejecución (o una sobrecarga masiva en el programa en lugar de un entorno de este tipo)

Para sus preguntas individuales:

  • ¿Tienes que incluir el <iostream> cada vez? ¿Alguna vez no lo necesitas?

#include <iostream> es la directiva que importa el encabezado <iostream> a su programa. <iostream> contiene los objetos de entrada / salida estándar, en particular, cout . Si no está usando objetos de E / S estándar (por ejemplo, solo usa E / S de archivos, o su programa usa una biblioteca de GUI, o está escribiendo un kernel de sistema operativo), no necesita <iostream>

  • misma pregunta para la biblioteca estándar, ¿cuándo no necesita std :: *?

std es el espacio de nombres que contiene toda la biblioteca estándar. using namespace std; es algo parecido from std import * , mientras que una directiva #include es (en este sentido) más como una declaración estándar de import std barebones. (en realidad, el mecanismo es bastante diferente, porque C ++ no usa el using namespace std; para buscar objetos automáticamente en la norma std ; la directiva using solo importa los nombres al espacio de nombres global).

Notaré aquí que las directivas de using namespace (que using namespace ) son frecuentemente mal vistas en el código C ++, ya que importan muchos nombres y pueden causar conflictos de nombres. Las declaraciones de using std::cout; ( using std::cout; ) se prefieren cuando es posible, ya que limitan el alcance de una directiva using (por ejemplo, a una función o a un archivo fuente). Nunca ponga el using namespace de using namespace en un encabezado sin una buena razón.

  • ¿Es la parte "principal" una función? ¿Alguna vez has llamado a la función principal? ¿Por qué es un número entero? ¿Por qué C ++ necesita tener una función principal pero Python no?

main es el punto de entrada al programa, donde comienza la ejecución. En Python, el módulo __main__ cumple el mismo propósito. C ++ no ejecuta código fuera de una función definida como Python, por lo que su punto de entrada es una función en lugar de un módulo.

  • ¿Necesitas "std :: cout <<"? ¿No es eso innecesariamente largo y complicado en comparación con Python?

std::cout solo es necesario si no importa el nombre de cout en el espacio de nombres global, ya sea mediante una directiva using namespace std; ( using namespace std; ) o mediante una declaración de using std::cout ( using std::cout ). En este sentido, una vez más se parece mucho a la distinción entre la import std Python y la import std from std import * o from std import cout .

El << es un operador sobrecargado para objetos de flujo estándar. cout << value llama la función de cout al value salida. Python no necesita ese código adicional porque la print está integrada en el idioma; Esto no tiene sentido para C ++, donde puede que ni siquiera haya un sistema operativo, y mucho menos una biblioteca de E / S.

  • ¿Necesita devolver 0 incluso cuando nunca lo va a usar?

No. main (y ninguna otra función) tiene un return 0; implícito return 0; al final. El valor de retorno de main (o, si se llama a la función de exit , el valor que se le pasa) se devuelve al sistema operativo como código de salida. 0 indica que el programa se ejecutó con éxito, que no encontró errores, etc. Si se encuentra un error, se debe devolver (o pasar a exit ) un valor distinto de cero.


Como ha dicho la gente, la respuesta simple es que son diferentes idiomas, con diferentes objetivos. Para responder a sus preguntas específicas ...

... ¿tienes que incluir el <iostream> cada vez? ¿Alguna vez no lo necesitas?

<iostream> es uno de los archivos de cabecera para iostreams, la parte de la biblioteca estándar de C ++ responsable de entrada / salida; en este caso, lo necesita para obtener acceso a std::cout . Si no está realizando operaciones de E / S en un archivo fuente, no necesita incluirlo; por ejemplo, la mayoría de los archivos que contienen definiciones de clase probablemente no necesiten <iostream> .

... la misma pregunta para la biblioteca estándar, ¿cuándo no necesita std :: *?

std es el nombre del espacio de nombres que contiene clases en la biblioteca estándar; Está ahí para evitar colisiones de nombres. Python tiene paquetes y módulos para hacer esto.

Puede usar la declaración de using para traer elementos de otro espacio de nombres a su alcance actual, vea esta entrada de Preguntas frecuentes para ver un ejemplo (¡y una explicación de por qué es malo traer todo el std al alcance ciego!).

... ¿Por qué la parte "principal" es una función? ¿Alguna vez has llamado a la función principal? ¿Por qué es un número entero? ¿Por qué C ++ necesita tener una función principal pero Python no?

Las instrucciones ejecutables en C ++ deben estar contenidas dentro de una función, y la función main se define como donde comienza la ejecución. En Python, las instrucciones ejecutables se pueden colocar en el nivel superior de un archivo, y la ejecución se define para.

Puede llamar a main() si lo desea; después de todo, es solo una función, pero no suele haber una razón para hacerlo. Detrás de escena, la mayoría de las implementaciones de C ++ llaman a main() una vez que la biblioteca de tiempo de ejecución ha realizado algunas tareas de mantenimiento.

El valor de retorno de main() se devuelve al sistema operativo. Esto proviene de C y UNIX, en el que se requiere que los programas de aplicación proporcionen un código de estado de salida de 1 byte, y devolver ese valor desde main() es una forma clara de expresar esto.

... ¿Por qué necesitas "std :: cout <<"? ¿No es eso innecesariamente largo y complicado en comparación con Python?

Esto es sólo una diferencia de diseño. iostreams es una bestia bastante compleja con muchas características, y uno de los efectos secundarios de esto es que la sintaxis es un poco fea para tareas simples a veces.

... ¿por qué necesita devolver 0 incluso cuando nunca lo va a usar?

Lo usas; este es el valor devuelto al sistema operativo como el estado de salida del programa.


En respuesta a sus preguntas al final de la publicación, se puede resumir con la filosofía de C ++:

No pagas por lo que no usas.

No siempre necesita usar stdin o stdout (¿aplicaciones de Windows / GUI?), Ni siempre usará el STL, ni todo lo que escriba necesariamente usará el main estándar (winAPI), etc. Como decía un póster anterior, C ++ es el nivel más bajo que Python. Estarás expuesto a más detalles, lo que te ofrece más control sobre lo que estás haciendo.


Esto me recuerda a la evolución de un programador . Algunos de los lenguajes y tecnologías demostrados están un poco anticuados ahora, pero debería tener una idea general. :)


Hay buenas razones para todas estas cosas. C ++ es un lenguaje muy amplio que se usa para todo, desde pequeños sistemas embebidos hasta aplicaciones gigantes creadas por cientos de programadores. El caso de uso de un chico que está construyendo un pequeño programa para ejecutarse en una computadora de escritorio no es el único. Así que a veces estás construyendo componentes de la biblioteca. En ese caso no hay main (). A veces estás trabajando en un sistema pequeño sin una biblioteca estándar. En ese caso no hay estándar. A veces desea crear una herramienta Unix que funcione con otras herramientas de texto Unix y señale su estado de finalización con un int devuelto desde main ().

En otras palabras, las cosas de las que te quejas son repetidas para ti. Pero son detalles vitales que varían para otros usuarios del idioma.


Python es un lenguaje de alto nivel . C ++ es un lenguaje de nivel medio .


Una de las razones por las que C ++ es bastante complicado es porque fue diseñado para abordar problemas que surgen en grandes programas. En el momento en que C ++ se creó como AT&T, su mayor programa de C tenía aproximadamente 10 millones de líneas de código. A esa escala, C no funciona muy bien. C ++ resuelve muchos de los problemas que se presentan con este tipo de programa.

Dicho esto, también es posible responder las preguntas originales:

  • include <iostream> donde sea necesario. Si tiene 10.000 archivos C ++, es bastante común que menos de 1000, a veces menos de 100, produzcan resultados visibles para el usuario.
  • Una declaración como la print "Hello, world" asume que hay una salida predeterminada, pero hace que sea difícil de generalizar. La forma cout << "Hello, world" hace que sea explícito a dónde va la salida, pero la misma forma también permite cerr << "Goodbye, world" y MyTmpFile << "Starting phase #" << i
  • La biblioteca estándar está en el std:: namespace. Mis 10.000 archivos estarán en 25 espacios de nombres adicionales.
  • main es una rareza en muchos sentidos, siendo la función de inicio.

<iostream> cuando quieras enviar cosas a la consola. Dado que la impresión "Hola mundo" implica la salida de la consola, necesita iostream .

La función main es llamada por el sistema operativo, básicamente. Se llama con los argumentos de línea de comando pasados ​​al programa. Devuelve un entero porque el programa debe devolver un código de error al sistema operativo (esta es la forma estándar para determinar si el último comando fue exitoso).

Siempre puedes usar printf("hello world"); en lugar de std::cout << "hello world"; Si quieres ir al estilo C. Es un poco más rápido de escribir y le permite hacer una salida formateada.

return 0 de main para indicar que el programa se ejecutó correctamente.

El compilador no incluye automáticamente todas las bibliotecas estándar y utiliza el espacio de nombres estándar porque a veces puede haber colisiones de nombres entre su código y el código de la biblioteca que realmente no necesita en absoluto. No siempre necesitas todas las bibliotecas. Del mismo modo, a veces está utilizando una rutina principal diferente (el desarrollo de Windows viene a la mente con su propia función de inicio de WinMain diferente). El compilador tampoco return 0 automáticamente return 0 porque a veces el programa necesita indicar que se completó sin éxito.