Publicado el 12 de Abril del 2018
555 visualizaciones desde el 12 de Abril del 2018
218,2 KB
18 paginas
Creado hace 12a (24/10/2011)
LenguajesdeProgramación.
Capítulo4.
Expresiones.
CarlosUreñaAlmagro
Curso2011-12
.
.
.
.
.
.
Contents
1 Introducción
2 Literales
2.1
Literalestiposprimitivos.
.
.
.
2.2
Literalesdetiposcompuestos(agregados)
3 Accesosavariables.
3.1 Accesosaelementosdevar. compuestas .
.
.
.
3.2 Accesosatravésdereferencias.
3.3 Expresionesdetiporeferenciaopuntero .
4 LLamadasafunciones
5 Expresionescondicionales
6 Operadoresinfijosyprefijos
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2
5
5
6
9
10
12
15
15
16
16
1
LP(11-12)4. Expresiones
1 Introducción
Lasexpresiones
• Lasexpresionessonotrodelosconceptosbásicosquesurgenenlosprimeroslenguajesdeprogramación
(p.ej. Fortran)
• Elobjetivoprincipalespoderexpresarconfacilidadcálculoscomplejos,conunasintaxisinspiradaen
lasmatemáticas.
Ejemplodeuncálculo
Sinexpresiones(usandosolovariablesyregistros)
r1 = [velocidad]
r2 = [tiempo]
r1 *= r2
r2 = [posini]
r1 += r2
[posact] = r1
Conexpresiones:
posact = posini + ( velocidad * tiempo ) ;
Elconceptodeexpresión
• Unaexpresiónesuntrozodeltextodeunprogramaquedenotaunprocesodecálculoqueproduce
comoresultadounvalor..
• Elcálculoserállevadoacabodurantelaejecucióndelprograma.
• Elprocesodellevaracaboestecálculosedenominaevaluarlaexpresión
• Unaexpresiónsepuedeevaluarunnúmeroarbitrariodevecesdurantelaejecucióndeunprograma.
Cadavezpuedeproducirunvalordistintocomoresultado.
Elconceptodeexpresión. Tipo.
• Esdeseablequeeltipodelvalorproducidoseaelmismotodaslasvecesqueelcálculoselleveacabo
durantelaejecucióndelprograma(facilitalalegibilidadylafiabilidad).
• Enesoscasos,llamamostipodelaexpresiónaltipodelvalorproducido.
creadoOctober24,2011
página4.2/18
LP(11-12)4. Expresiones
Elconceptodeexpresión. Tipo.
• Enloslenguajesenconsideración(C/C++, Ada, Java, C#, python), todaexpresióndeunprograma
tieneuntipo.
• Enalgunoslenguajesinterpretados(Php,p.ej.),cadaevaluacióndeunaexpresiónpuedeproducirun
valordeuntipodistinto. Lasexpresionesnotienentipo.
EjemplodeexpresionessintipoenPHP
Java:
x = 2∗3+4 ;
float
//
’2∗3+4’ es una expresion de tipo entero
php:$x = ...
;
( $x > 0 )
if
$v = 45 ;
else$v = "hola"
//
;
echo $v
//
Elconceptoformaldeexpresión.
• Formalmente,unaexpresiónesunaaplicaciónqueasignaunvaloracadaestadodeejecuciónposible.
• Unestadodeejecuciónesunconjuntofinitodevariablesdistintas,cadaunaconalmenosunnombre,
untipo,yunvalordeltipo.
Elconceptodeexpresión: estadosdeejecución
Unejemplodeunestadodeejecucióneselsiguienteconjuntodedosvariables(cadaunaesunatupla).
Enprincipio,losnombresdedosvariablesdeunestadodeejecuciónnopuedencoincidir
;
’$v’ es una expresion de
tipo
’entero’ o ’cadena’
{ ( "x", integer, 1 ) , ( "peso", float, 67.8 ) }
creadoOctober24,2011
página4.3/18
LP(11-12)4. Expresiones
Elconceptoformaldeexpresión.
• Si edenotaunaexpresióndetipo Ty Sunestadodeejecución,entonces e(S)esunvalordetipo T
quecoincideconelresultadodeevaluar eenelestadodeejecución S.
• Normalmente,escribiremosdichovalorusandounafunciónllamadaeval,queasignaunvaloracada
expresiónyestadodeejecuciónposible:
e(S) = eval(e, S)
Fallosenlaevaluación:
• Notodaslasexpresionespuedenevaluarseentodoslosestadosdeejecuciónposibles.
• Formalmente: eldominiodecadaexpresiónposible(vistacomounaaplicación)seráunsubconjunto
detodoslosestadosdeejecuciónposibles.
Fallosenlaevaluación. Ejemplos.
• Supongamos que 4*x+2 es una expresión de tipo entero. En estas condiciones, el dominio de la
expresiónsontodoslosestadosdeejecuciónquecontienenalmenosunavariabledenombre xyde
tipoentero.
• Eldominiodelaexpresiónentera 5+8/xseráunsubconjuntodeldominiode 4*x+2, enconcreto,
solocontendráestadosdeejecuciónenloscualeslavariabledenombre xnocontengaelvalor 0.
Fallosenlaevaluación.
• Decimosquelaevaluacióndeunaexpresiónfallacuandotienelugarenunestadodeejecuciónque
no pertenece a su dominio. Si la evaluación de e falla en el estado S, entonces escribiremos que:
eval(e, S) = error.
• Aquí, errorseconsideraunvalorespecialdeltipo. Duranteunaejecuciónprograma,elvalorresultado
delaevaluaciónesindeterminado,ydichaejecucióndeberíaabortar,obiensedeberíadeproducir
unaexcepción.
Categoríasdeexpresiones.
• Enelrestodeestecapítuloexaminaremoslasdistintascategoríasdeexpresionesquepuedenaparecer
enloslenguajesdeprogramación.
• Noexistendiferenciasimportantesenlascategoríasdelasexpresiones,nienlasintaxisdelasmismas,
entreloslenguajesAlgol,Pascal,C/C++,Ada,JavayC#
creadoOctober24,2011
página4.4/18
LP(11-12)4. Expresiones
2 Literales
2.1 Literalestiposprimitivos
Literalesdetiposprimitivos
• Unliteralesunaexpresiónquedenotadirectamenteunvalordeuntipo
• Elresultadodeevaluarunliteralessiempreelvalorquedenota. Nodependedelestadodeejecución.
• Encualquierlenguaje,estetipodeexpresionessitieneuntipo.
Literalesdetiposprimitivos
• Enlapráctica,laevaluacióndeunliteralnoconllevacálculoalguno.
• Laevaluacióndeunliteralnopuedefallar,yaquepuedehacerseencualquierestadodeejecución.
• Losliteralesdetiposprimitivossonlasexpresionesmássencillasposibles.
Tipológico
Enlainmensamayoríadeloslenguajesqueincorporaneltipológico( {true, f alse}),existendosliterales
quedenotanlosdosvaloresdeltipo:
• truequedenotaelvalor true
• falsequedenotaelvalor f alse
Caracteres
• Normalmente,estosliteralesseescribenespecificandoelcarácterquedenotanentrecomillassimples.
Porejemplo,elcarácterconcódigoASCII48(eldígito0),sedenotacon ’0’
• TodosloslenguajesincorporanlaposibilidaddeescribirunodeestosliteralesusandoelcódigoASCII
oUnicodedelcarácterencuestión. (p.e.j. ’\60’o ’\x30’enC/C++,o ’\060’o ’\u0030’en
Javadenotantodoselcarácter ’0’).
Enumerados
• Enladefinicióndeuntipoenumerado,elprogramadorproporcionaunidentificadorparacadavalor
distintodeltipo.
• Esteidentificadorseconsideracomounliteraldeltipoenumerado
creadoOctober24,2011
página4.5/18
LP(11-12)4. Expresiones
Enteros
• Estosliteralesseescribennormalmentecomosecuenciasdedígitosconsecutivos,quecoincidenconla
expresiónenbase10delvalorquedenotan
• Suelenexistirmecanismosparaexpresarlosvaloresenbase8oenbase16
• EnAda,sepuedeescribir7_654_321enlugarde7654321(mejoralalegibilidad)
Enteros. Resolucióndeambigüedadeneltipo.
• Alosliteralesformadosporsecuenciasdedígitosselespuedeasignarmásdeuntipoentero,yaque
losintervalosdeenterosincluidosencadatiponosondisjuntos.
• Porejemplo,laexpresión34puedeser,enC/C++decualquieradelostiposenteros(char,short,int,
long,...)
Enteros. Resolucióndeambigüedadeneltipo.
• Enalgunoslenguajes(C/C++,Java,C#):
– Seleasociaeltipoquemenosbitsocupe(menorrangodevalores)yquecontengaalvalorentero
denotadoporelliteral.
– Sepuedenforzarotrasinterpretaciones(p.ej.,enC/C++34Lesdetipolong)
• Enotroslenguajes(Ada),seusaeltipoqueseesperasegúnelcontextodondeaparecelaexpresión
2.2 Literalesdetiposcompuestos(agregados)
Literalesdetiposcompuestos(agregados)
• Sonexpresionesquedenotandirectamenteunvalor(deuntipocompuestoorecursivo),yquesiempre
seevalúanadichovalor.
• Básicamentepuedenexistiragregadosdetiporegistroydetipoarray,aunqueloslenguajesfuncionales
suelencontemplardetiposrecursivos(listasyárboles).
• EnC/C++yJavasolosepermiteneninicializacionesdevariables,enAdayC#encualquierlugar
creadoOctober24,2011
página4.6/18
LP(11-12)4. Expresiones
AgregadoseninicializacionesenC/C++
main()
{
int c[3] = { 34, 56, 78 } ;
struct { int
.....
}
UsoerróneodeagregadosenC/C++
Esunejemploausenciadeuniformidadenellenguaje
main()
{
i, char c } s = { 12,
’A’ } ;
;
;
Integer
;
página4.7/18
// error!
int c[3]
;
i, char c } s ;
struct { int
c = { 34, 56, 78 } ;
// error!
’A’ } ;
s = { 12,
}
AgregadoseninicializacionesenAda
procedure Agregados is
is Array( 1..3 ) of
type matriz
type registro is record
i
;
Integer
:
;
c : Character
end record ;
m : matriz := ( 23, 45, 67 )
registro := ( 12,
r
:
’A’
)
begin....
end Agregados
AgregadoseninicializacionesenAda
procedure Agregados is
type matriz
...
is
creadoOctober24,2011
;
;
....
;
;
LP(11-12)4. Expresiones
type registro is
;
m : matriz
registro ;
r
:
begin
m := ( 23, 45, 67 )
r
;
)
:= ( 12,
’A’
end Agregados
;
Agregadosconetiquetas
EnAda,enlosagregadossepuedenespecificarlosnombresdeloscamposolosíndicesdeloselementos
procedure Agregados is
...
begin
i => 12, c => ’A’
r
:= (
)
;
r
;
i => 12 )
:= ( c => ’A’,
m := ( 1 => 23, 3 => 45, 2 => 45 )
m := ( 1 => 23, 2..3 => 45 )
end Agregados
AgregadosenJavayC#
En Java y C# no existen agregados de tipo registro o clase, pero sí de tipo Array. Pueden aparecer en
cualquiersitio:
// declaraciones con inicialización:
int[5] m = { 1, 2, 3, 4, 5 }
int []
m = { 1, 2, 3, 4, 5 } ;
m = new int [] { 1,2,3,4,5 } ;
int []
m = new int [] { 1,2,3,4,5 } ;
fun( new int [] {1,2,3,4,5} )
// en asignaciones:
// como parámetros:
;
;
;
;
creadoOctober24,2011
página4.8/18
LP(11-12)4. Expresiones
3 Accesosavariables.
Accesosavariables
Losaccesosavariablesson,engeneral,expresionesquedependenexplícitamentedelestadodeejecución,
esdecir,delosvaloresdelasvariablesexistentesenelmomentodelaevaluación. Haydevariostipos:
• Accesossimples
• Accesosaelementosdevariablescompuestas
• Accesosatravésdereferencias
• Combinaciones
Accesossimples
• La forma más simple de acceder a una variable es usar una expresión formada únicamente por el
nombredelavariable:
• Silavariablenoexisteenelestadodeejecuciónactual,laevaluaciónfalla. LoslenguajescomoAda,
Pascal,C/C++,JavayC#compruebanestoentiempodecompilación(yaquelasvar. tienenámbito
estático).
• Silavariableexiste,elresultadodelaevaluacióneselvaloractualdedichavariable.
Accesossimples
• En los lenguajes donde las variables tienen un único tipo, el tipo de la expresión es el tipo de la
variablenombrada
• Sienellenguajelasvariablesnotienenasignadounúnicotipo,laexpresióntampocotienetipo(poco
recomendable,bajalegibilidad).
• Esdeseableevitarevaluacionesfallidasentiempodeejecución,asíquemuchoslenguajescomprueban
Comentarios de: Capítulo 4. Expresiones (0)
No hay comentarios