0 оценок0% нашли этот документ полезным (0 голосов)
69 просмотров7 страниц
Para qué nos sirve un operador de asignación y cuáles son las clases de operadores. También veremos los operadores aritméticos y demas utilizados en Visual C++.
Para qué nos sirve un operador de asignación y cuáles son las clases de operadores. También veremos los operadores aritméticos y demas utilizados en Visual C++.
Para qué nos sirve un operador de asignación y cuáles son las clases de operadores. También veremos los operadores aritméticos y demas utilizados en Visual C++.
C++ dispone de los siguientes operadores de asingacin:
Sintaxis: Ejemplo: x = 3; x += 3; x &= 3; Todos ellos son operadores binarios, de los cuales,b= es el nico de asignacin simple, los dems son operadores de asignacin compuestos Los seis primeros aceptan operandos de distinto tipo, mientras que los cinco ltimos: =, &=, != y |=, implican manejo de bits por lo que sus operandos deben ser tipos int en sus distintas variantes !o olvidar que las e"presiones de asignacin producen un resultado #l tipo resultante es el de la $i%quierda&' el valor que se aplica es el determinado por el "#alue #l valor resultante de despu(s de la asignacin, es el resultado de la e"presin $el $#alue& )s* pues, cualquiera que sea su sentido concreto, todos implican la +copia+ de un bloque de memoria $que contiene el +resultado+& en algn sitio $la direccin indicada por el ,value& #jemplo: int num'loat - = ./0' num = - 1 /' #n este caso, el valor 0/0, resultado de , se aplica a num 2eniendo en cuenta que el tipo resultante debe ser el de num $un int en este caso&, se reali%a automticamente una conversin del %loat 0/0 a int $con p(rdida de precisin si es necesario&, con el resultado de que num recibe el valor 0 y el resultado de la asignacin es un int de valor 0 #sta propiedad de las asignaciones de producir un resultado, es justamente la que permite e"presiones de asignacin compuesta del tipo: ) = 3 = 4 = 5' y es ampliamente utili%ada en la programacin de 411 4onsidere el bucle del siguiente ejemplo: 67ile $ $c7 = getc7ar$& & 8= 9: & ' aprovec7ando que en este caso, el resultado de la asignacin es un c&ar, se utili%a directamente en la clusula del '&ile, resultando que el bucle se ejecuta inde-inidamente 7asta que se pulse la tecla #;4 $escape& #n general las sentencias de asignacin tienen la -orma: variable = e"presion ;i ( es un operador compuesto, la e"presin #/ <= #9 equivale a #/ = #/ < #9 =or ejemplo: #/ 1= #9 equivale a #/ = #/ 1 #9 #jemplos " >= y equivalentes >?" = " > y " >= y 1 9?> equivalentes >?" = " > $y 1 9& Leer ms: 7ttp:??666monogra-iascom?trabajos@.?operadoresAc?operadoresA cs7tmlBoperadorebBi"%%.@,/C,@#D E=#,)5E,#; 5# F!4,#G#!2E y 5#4,#G#!2E Los )peradores de incremento y decremento son operadores unarios que agr egan o sustraen uno de sus operandos, respectivamente ;on normalmente implementados en lenguajes de programacin imperativos #n lenguajes tipo 4 es normal tener 9 versiones $preA y postA& de cada operador con semntica ligeramente di-erente #n lenguajes tipo 4, el operador de incremento es escrito como 11 y el de decremento como AA #l operador de incremento aumenta el valor de su operando en / #l operando debe ser un tipo de dato aritm(tico o puntero, y debe 7acer re-erencia a un objeto modi-icable ;imilarmente, el operador de decremento disminuye el valor de su operando en / #l valor de los punteros se incrementa $o disminuye& por una cantidad que 7ace que apunte al siguiente $o anterior& elemento adyacente en memoria #n lenguajes que admiten ambas versiones de los operadores, los operadores de preAincremento y preAdecremento aumentan $o disminuyen& sus operandos en /, y el valor de la e"presin es el resultado del incremento $o decremento& #n contraste, los operadores de postAincremento y postAdecremento incrementan $o decrementan& el valor de sus operandos en /, pero el valor de la e"presin es el valor original de su operando antes del incremento $o decremento& #n lenguajes donde el incremento?decremento no es una e"presin $#j: Ho&, slo se necesita una versin $en el caso de Ho, solo post operadores& 5ado que el operador de incremento?decremento modi-ica su operando, el uso de ms de una ve% dentro de la misma e"presin puede producir resultados no de-inidos =or ejemplo, en e"presiones tales como " I 11", no est claro en qu( orden se deben reali%ar la resta y el operador de incremento ;ituaciones como esta son aun peores cuando se aplican optimi%aciones por el compilador, lo que podr*a dar lugar a un orden de ejecucin de operaciones di-erente de lo que pretende el programador #jemplosJeditarK Los siguientes -ragmentos de cdigo 4 ilustran las di-erencias entre operadores de pre y post incremento?decremento: int "' int y' // Operadores de incremento " = /' y = 11"' // x es ahora 2, y es tambin 2 y = "11' // x es ahora 3, y es 2 // Operadores de decremento " = .' y = "AA' // x es ahora 2, y es 3 y = AA"' // x es ahora 1, y es tambin 1 #l operador de postAincremento es comnmente usado en los sub*ndices de vectores =or ejemplo: // Suma de elementos de un vector -loat sumarLelementos$-loat vecJK, int n& M -loat sum = CC' int i = C' 67ile $i N n& sum 1= vecJi11K' // Post- incremento de i, ue recorre // los n elementos del vector return sum' O )simismo, el operador de incremento es comnmente utili%ado con punteros: // !opia un vector a otro usando punteros void copiarLvector$-loat >desde, -loat >7asta, int n& M 67ile $nAA P C& // "ucle ue cuenta desde n hasta # >7asta11 = >desde11' // !opia el elemento $%desde& a $%hasta&, // luego incrementa ambos punteros O *+,+- )perador Condicional 1 Sinopsis #l operador condicional es el nico operador ternario de la gramtica 411 y sirve para tomar decisiones =roporciona un resultado entre dos posibilidades en -uncin de una condicin .ota: =uede a-irmarse que este operador 7a 7ec7o -ortuna, ya que e"iste con la misma sinta"is e id(ntico comportamiento, en multitud de otros lenguajes de programacin 2 Sintaxis expresion-relacional ? expr1 : expr2 3 Comentario #l operador condicional / : produce un resultado #n la e"presin E1 ? E2 : E3, E1 es una e"presin relacional $ 0Q/9& que se evala primero ;i el resultado es cierto, entonces se evala E2 y este es el resultado #n caso contrario $si E1 resulta %also&, entonces se evala E3 y este es el resultado Ebserve que si la premisa E1 es cierta, entonces no llega a evaluarse la e"presinE3 03+1 #l operador / : puede usarse para sustituir ciertas sentencias del tipo i%2t&en2else, aunque puede conducir a e"presiones ms compactas que las correspondientes i%+++else #n el ejemplo que sigue, a y se le asigna el valor /CC: x = 10; y = x > 9 ? 100 : 200; 03+3 !o es necesario poner par(ntesis en la primera e"presin $E1&, ya que la precedencia $ 0QCa& de / : es muy baja $justamente sobre la asignacin = & 5e todos modos, es aconsejable ponerlos por legibilidad y = (x > 9)? 100 : 200; 03+3 #n caso de que E1 no sea una e"presin relacional, debe ser un escalar reducible a un booleano $4onversin de tipos .9/b& =or ejemplo es vlido: int y = 6 ? 7: 8; aunque en este caso el resultado ser*a siempre y == 7 $el int R se se traduce en el booleano true& 03+* #n ocasiones se aprovec7an los e-ectos laterales $ 0Q& del operador para producir un resultado #jemplo: x ? y : --!; #l compilador H!S cpp permite la ausencia del segundo operando en este tipo de e"presiones =or ejemplo, es vlido: x ? : !; "" E1 #l resultado de esta e"presin es el valor de x si este es distinto de cero, y 4 en caso contrario =or consiguiente, es equivalente a: x ? x : !; "" E2 #l manual in-orma que este tipo de e"presiones solo son de utilidad en caso de que la evaluacin de x tenga e-ectos laterales $por ejemplo, que sea utili%ada como argumento en una -uncin&, en cuyo caso la e"presin #9 tendr*a e-ecto lateral doble si x es distinto de cero La omisin del segundo operador en #/ evitar*a esta computacin indeseada y dejar*a el valor previamente computado sin que se produ%ca un doble e-ecto 0* #9 y #. deben seguir las reglas siguientes: / ;i #9 y #. son de tipos distintos, se reali%a una conversin de tipo estndar, de -orma que el resultado ser siempre del mismo tipo, con independencia de #/ 9 ;i #9 y #. son de tipos unin o estructuras compatibles #l resultado es una unin o estructura del tipo de #9 y #. . ;i #9 y #. son de tipo #oid, el resultado es #oid 0 )mbos operandos son punteros a versiones cuali-icadas o no cuali-icadas de tipos compatibles #l resultado es un puntero a cualquiera de los tipos de ambos operandos T Sn operando es un puntero y el otro es un puntero nulo #l resultado es un puntero que puede seUalar a un tipo del primero o del segundo operando R Sn operando es un puntero a un objeto o tipo incompleto, y el otro es un puntero a una versin cuali-icada o no cuali-icada de #oid #l tipo resultante es el del puntero distinto de void 5 Ejemplos 05+1 ;uponiendo que ! e y sean Lvalues, las siguientes e"presiones son equivalentes: (x ? y : !) = 10; (x ? y = 10 : (! = 10)); 05+3 #l bucle que sigue imprime n elementos de una matri%, /C por l*nea, con cada columna separada por un espacio y con cada l*nea terminada por un !L $nueva l*nea&, incluida la ltima #or (i = 0; i $ n; i) print# (%&6'&c%( a)i*( (i&10==9 ++ i==n-1) ? ,-n, : , ,); 05+3 #jemplo: print# ( %.ienes &' ite/&s0-n%( n( n==1 ? %% : %s%); 05+* #jemplo: 1incl2'e $iostrea/03> 1incl2'e $ti/e03> int /ain(4oi') 5 "" ============ ti/e6t t; ti/e(7t); str2ct t/8 pet/ = localti/e(7t); lon9 '9t = 6ti/e!one"60; co2t $$ %:i#erencia 3ora local con ;reen<ic3 = % $$ a=s('9t) $$ % /in2tos % $$ ('9t == 0 ? %-n% : ('9t $ 0 ? %a'elanto-n% : %atraso-n%)); co2t $$ %>orario: % $$ (pet/->t/6is'st ? %?erano% : %@n4ierno%) $$ en'l; A ;alida: Diferencia hora local con Greenwich = 60 minutos adelanto Horario: Verano