Duda estúpida de C

zildjian

Mañana tengo el 1er examen de C en la uni, y haciendo aquí unos sencillos test de autoevaluación, me he topado con la siguiente pregunta y lo he visto muy claro, he marcado la B sin dudarlo, y en las soluciones pone que es la A. Es una errata o el if está mal hecho o qué cojones? xD

litri

La respuesta correcta es la A.

if(x=1) estas haciendo una assignación dentro de un if, cosa que siempre dara verdadero como resultado (por decirtelo de alguna manera...).

if ( x = 1 ) y if ( x == 1 ) NO SON LO MISMO.

Si contestas la pregunta B, estas contestando a if ( X == 1 ).

Se que no me explico bien, pero menos es nada xD

maRc

#2, bien, pero tu razonamiento está mal.

Una asignación devuelve el valor que asigna. x = 1, devuelve 1, x = 2321, devuelve 2321, x = 0, devuelve 0.

Así, siendo un "if (x = 1)", x = 1 devuelve 1, que es verdadero, por lo que se mete por el primer printf. Sin embargo, si llega a ser "if (x = 0)", como x = 0 devuelve 0, que es falso, se metería por el segundo printf.

litri

#3

Un if es "TRUE" si da cualquier cosa diferente de 0, por lo tanto si haces x=1 es como si fuera "TRUE" que es lo que l'he he venido a decir.

ExTiNcT_

Digamos que para que la respuesta correcta sea la B), el if tendria que ser: if( i == 1 ).
Con el == lo que vendrias a preguntar es, si la variable i toma por valor 1, realmente es 0 y te salta al else.

En cambio, en el codigo que tu has pegado lo que te hace es un simple i=1; y luego te entra al if, porque realmente no comparas nada, simplemente asignas una variable a 1, y como eso siempre es cierto te entrará en el if.

zildjian

Cierto, sutil pero grave error, gracias!

B

Resumiendo xD

En C las setencias condicionales NO evaluan booleanos. Si lo que hay dentro es 0, es falso, para todo lo demas verdadero.

Esta en cursiva pq realmente no evalua verdadero y falso, no evalua ninguna condicion booleana. Solo si es 0 o distinto de 0.

BLZKZ

es lo que no me gusta de C, pero vaya el caso es facil xD

Eso te lo ponen a modo de "mira como no se hace y como la puedes cagar si haces una asignacion en lugar de una comparacion"

JuAn4k4

Dado "es" siguiente programa...

Yo tenia un profesor que consideraba fallo tener comentarios sin tildes..

maRc

#4, tu has dicho que una asignación se evalúa siempre a verdadero, cuando no es cierto.

Lee bien lo que digo, y si no te lo crees, hazte el programa de prueba, que yo me lo he tenido que hacer (siempre pruebo las cosas porque ya me he llevado algún que otro owned por ir de listo).

Riu

A.
x=1 es Verdadero. si fuera 0 seria falso.
#10 agree, quien tiene boca se equivoca y encima va de listo xdd

Soleil

La respuesta correcta debería ser:
e) El programa mostrará uno de los tres comportamientos siguientes dependiendo del compilador
donde se use:
1) Muestra "Igual a 1"
2) Genera un warning y se comporta como 1
3) Genera un error en tiempo de compilación.

Debido a que main devuelve void y "void main" no está realmente definido en el C99 y se deja a cargo de cada implementación. Algunas librerías de hecho dependen en que main devuelva un int para saber el valor de estado de ejecución. (correcto/error etc...) En C89 debe haber además "return" por norma.

Watcom C, VisualAge, Visual C++ se comportan como 1 y aceptan void main sin rechistar.
GCC genera el warning.
MetaWare C, EMX C, generan error o comportamiento no definido.

Para el caso aunque casi siempre rulará, no está de más coger buenas costumbres...
int main(int argc, char* argv[])

Más cosas al respecto:
http://www.eskimo.com/scs/readings/voidmain.960823.html

B

yo creo que la respuesta es :

H) Suspendere el examen pues no diferencio una equivalencia de una asignación.

GaN2

Yo creo que la respuesta es la C, si os fijais hace el if con = en vez de ==, con lo cual da error de compilación, o al menos lo hace en C#...

B

#12

Hay mas mundo a parte de los pcs xD

Lo digo por lo de "buenas costumbres", dependiendo de la arquitectura hay unas u otras :P

#14

No da error de compilacion en C ni en C++, mira #7.

Ahora bien, desconozco C#, pero por ejemplo en JAVA si da error al compilar, ya que dentro de un if se debe devolver un boolean en la condicion.

Byr0n

Lo primero que hace el compilador es asignar el valor, en este caso 1 a x, y luego evaluara, por lo que quedaria algo asi de if (x=1) :
if (1) {
}
else {
}
Y cualquier numero mayor que 0 se computa como true, y el 0 como false.

GaN2

En C# da error seguro, pero como en C o C++ se comporta diferente, entonces no tengo ni idea.

kas

Es impresionante como estando en el 2008 no hay un unico compilador con unas unicas reglas de compilacion para C/C++.

maRc

#18, respuesta tonta del día...

Hay varios compiladores con varias reglas porque una cosa es como hablas y otra como debes hablar.

Un compilador debería ajustarse a un estandar concreto (KR, C89, C99), pero eso no le impide que acepte los tres estandares o incluso que añada mejoras o nuevas características al lenguaje. Obviamente un programa escrito que use esas características solo se podrá compilar con aquellos compiladores que las incorporen.
De todas formas, si quieres ajustarte a un estandar solamente tienes que decirle al compilador que lo haga, puesto que suelen llevar una opción para ello.
Además, escribir un programa ajustandote totalmente al estandar puede ser muy pejillero, dandote errores por todas partes, por lo que los compiladores suelen relajar algunas de las restricciones del lenguaje.

Por último, el hecho de que existan varios compiladores te da la posiblidad de elegir, además genera competencia entre ellos, lo que hace que cada vez sean mejores y su desarrollo no se estanque. Incluso gracias a que pueden existir varios compiladores, puedes compilar programas para nuevas arquitecturas.

kas

Insultos a parte, intentas decirme que es bueno tener que saberse varios estandares, que los compiladores pueden seguir uno, dos, varios o ninguno porque pueden saltarse las reglas y que eso mejora algo?

A mi me jode bastante cuando ando buscando código, tener que buscar el compilador que hace que ese código compile.

No creo que sea nada productiva, desde el punto de vista del desarrollador, esa forma de ver elm mundo del desarrollo.

Porque hay competencia en el mundo de compiladores? No son gratis? Los que he usado yo para Windows y Linux si lo son.

No seria mejor unir esfuerzos para hacer uno solo?

PD: Perdon si se esta conviritendo en offtopic.

B

#20

No es para nada offtopic, es una bonita discusion xD.

Actualmente, tienes compiladores de C en casi cualquier arquitectura de manera gratuita, bendito gnu.

Pero si quieres algo mas profesional, en el sentido de que tienes unas necesidades en el que gnu no pueda competir..... ahi hay negocio, y es ahi donde tienes los compiladores propietarios.

Piensa que existe mucho mas mundo a parte del pc y el x86. Sobre todo para sistemas empotrados y de tiempo real.

Ademas tienes que pensar, que los compiladores propietarios tb vienen con su correspondiente IDEs propietarios, que atienden necesidades especificas que te hacen ahorrar tiempo y dinero, y otros IDEs gratuitos no te dan.

Pedir que exista uno solo? eso es como pedir que haya solo un unico modelo de automovil, es decir... xD

BLZKZ

#20 compiladores de c/c++ todos gratis? hola? se nota que has usado visual estudio / borland

Y borland desde hace decadas es una empresa que se dedica a hacer compiladores y que yo sepa hacia dinero con ellos (que yo haya usado son builder c++ y turbo pascal) que haya opciones gratuitas no digo que no.

Eso si, lo poco que he hecho en c tanto en windows con dev-c++ como con la consola de linux me ha compilado asi que no se que cuentas :S

kas

Primero no os lo tomeis como algo personal, esto no es el foro de CS.

Segundo, entiendo perfectamente que el campo de aplicacion de C/C++ es extremadamente amplio y no se reduce a x86.

Pero me referia mas bien al desarrollo de aplicaicones para x86 en concreto.

En este punto, ademas, me gusria recalcar que yo, habitualmente, busco codigo, siguiente el concepto DRY.

Entonces, con estas bases, aqui es donde me he encontrado con problemas:

Reaprovechando codigo para analizar el bpm de un archivo mp3.
Usando el SDK de un lector RFID.
Reaprovechando codigo para hacer una libreria que maneje un Sony AIBO mediante URBI.

Mientras que buscando codigo para, por ejemplo, C# o VB .NET esta claro que no he tenido problemas.

Antes de que psoteeis correindo: se que son lenguajes propietarios. Pero tambien se que el compilador es gratuito, no asi el IDE.

Por lo tanto, vuelvo a insistir: Proque no hay un unico estandar C/C++ para el mundo del desarrollo x86?

maRc

#20, saltarse el estandar no es ni bueno ni malo, porque a veces el estandar no es perfecto.

Tu no te tienes que saber varios estandares ni nada de eso, básicamente porque dudo que en algún momento llegaras, ni yo tampoco, a saberte uno entero. Bueno, puede que #12 se lo sepa :P.

Por ponerte un ejemplo, acaba de salir el borrador del nuevo C++ con 1200 páginas. ¿Y qué hacemos ahora, nos olvidamos de los compiladores viejos? ¿O pasamos de él porque todavía no hay ningún compilador que lo siga por completo?

Otro ejemplo. Este año en una asignatura trabajamos con un microcontrolador, con el que podíamos acceder a los registros del procesador. Estos eran de tipo sfr16 (o algo así, no me acuerdo), que no está definido en el estandar de C. ¿Si tengo que ajustarme completamente al estándar, como podría haber accedido a ellos?

Con que sepas los aspectos básicos del lenguaje, que son comunes a todos los estandares y compiladores, probablemente podrás compilar cualquier código que escribas en cualquier compilador. Eso sí, bibliotecas externas a parte. Yo no he encontrado todavía ningún código que haya podido compilar con el gcc sin modificarlo.

Por último, otro ejemplo de porque hay que seguir los estandares, pero los programas encargados de interpretarlos deben saltarselos a veces.
Hay un estandar de HTML, que se supone todas las páginas web debería seguir. Los navegadores tratan de ajustarse a este, pero que una página se ajuste al estandar es muy difícil, por ello, pueden saltarse algunas de las reglas que dice el estandar y aún así, que la página se vea bien.
Aquí puedes ver si MV se ajusta al estandar: http://validator.w3.org/check?uri=www.mediavida.com
Como ves, da 159 errores y 137 warnings. ¿Te imaginas que intentas entrar y te salta una ventana diciendote que la página no es estandar y no te la muestra?

#23, tu te estas refiriendo a la bibliotecas. Java o .NET tienen un catalogo de funciones y bibliotecas enorme, tanto para realizar operaciones muy básicas como otras más complejas, porque son o plataformas de muy alto nivel y además están respaldados por una compañía, Sun y MS respectivamente. Pero ojo, que ambos también tienen versiones distintas, y aunque tratan de que las nuevas sean compatibles con las anteriores, no siempre es así. Yo este año tuve problemas con un programa porque era para Java 2 y yo tenía la versión 6.

C y C++ tienen el "problema" de que son lenguajes de un nivel bastante bajo, y aunque si que tienen algunas bibliotecas estandar, se limitan prácticamente a E/S y algunas cosas más, pero no pueden tener definidas cosas más complejas, como el dibujar ventanas.

kas

#24 Entiendo perfectamente tu enfoque desde el punto de vista de micros y otro hardware, ya sea industrial o no. En el centor de investigacion en el que trabajo es el pand de cada dia del laboratorio.

En caunto a lo de las librerias... si y no.

Es decir: Existe una especificacion del lenguaje C# y existe .NET, que son todas las librerias.

Por un lado me gusta que toda la faena que habia que ahcer hace 20 años ya este hecha: i/o automtaizado con Streams, hashtables, conexiones tcp, etc etc.

Pero eso no quiere decir que yo este criticando que C/C++ no las tenga (aunque creo que a dia de hoy ya deveria tenerlas).

A lo que me refiero es que, cuando abres un codigo en C/C++ para Windows por ejemplo, en los .h empeizas a ver declaraciones y mas declaraciones de constantes, cuando compilas empiezan a fallar las referencias de los defines, que a veces no sabes si son del API de windows o del source que estas tocando.

A dia de hoy mucha gente continua programando en C/C++ para hacer aplicaciones para windows y lo que me molesta es lo que comento en el parrafo anterior: cuando me leo el codigo no puedo ir directamente a las clases y sus funciones, tengo que empezsar a buscar que son cada una de esas declaraciones, luego ver como las aplican y alomejor hast apreguntarme porque..

En C# yo abro un codigo y se que solo tengo que leer sus clases y sus funciones y que tengo una documentacion de 3 pares de narices sobre cada cosa que ya este hecha (aka msdn .net).

Y con lo del estandar me referia a que el mismo codigo en VisualC++6 y en MinGW no funciona.

EDIT: En cuanto a las webs, en realidad los primeros que no respetan los estandares son los navegadores y por ello hay que desarrollar codigo (css) para IE7, IE6, FF3, etc..

Soleil

"i/o automtaizado con Streams, hashtables, conexiones tcp, etc etc."

En realidad, aunque muchas veces está bien que un lenguaje tenga colecciones y muchas facilidades integradas (vease Java, Python, .NET), otras veces es preferible partir de un nivel inferior. El motivo es que no siempre se puede depender de esas implementaciones, debido al compromiso que existe en todo entre memoria/cpu/seguridad etc...

Pongo un ejemplo. Cuando porté Jscheme a C# desde Java, probé diferentes colecciones para los entornos (closures). Primero probé Dictionary<string>,<Object>, luego Hashtable y finalmente HybridDictionary (una variante híbrida entre Hashtable y ListDictionary). Ninguna de las tres pudo darme el rendimiento que esperaba.

spoiler

Al final opté por crear mi propia colección. Una hashtable que únicamente puede crecer, de la que no se pueden borrar valores, inmutable y con una caché que no añade algo si ya existe, en su lugar hace un puntero al valor existente de otra clave. Es el compromiso del que hablaba, uso más memoria, pero es más rápido en tiempo de cpu.

Hay lenguajes donde está bien el entorno sea minimalista y simple. Para sistemas embebidos Forth o C son geniales, ocupan poco, compilan a código máquina, etc... De todos modos hasta C++ tiene librerías para todo eso (aunque no vengan en el standard) como Boost.

maRc

#25, vale, ya nos entendemos perfectamente. Tu te estás refiriendo a las bibliotecas, no al lenguaje estandar.

El lenguaje es C#, que es estándar ECMA, que se combina muy bien con la plataforma .NET, que tiene un montón de bibliotecas. Tu puedes tener un compilador de C#, que compile perfectamente respecto al estandar, pero no tener las bibliotecas, con lo que tendrías el mismo problema.

De todas maneras, es comprensible tu postura, porque programar algo con las MFC es una locura, y ahí yo también me quejo, pero es porque la manera de programar con ellas es muy liosa. Prueba con algún framework más moderno para C++, como Qt, y verás que se asemeja mucho al estilo de C# + .NET.

Comprad0r

Según este compilador online:

A.-

#include <stdio.h>
#include <math.h>

void main()
{

int x=0;

if (x=1)

printf ("Escribir iguales");

else

printf ("distintos");

}

Output:
Escribir iguales

B.-

#include <stdio.h>
#include <math.h>

void main()
{

int x=0;

if (x==1)

printf ("Escribir iguales");

else

printf ("distintos");

}

Output:
distintos

Que cada uno saque su respuesta xD.

Yo también hubiera marcado la B pero no, es la A xD.

kas

En este foro hay un tag para el codigo!

int x;

[ "code" ]
int x ;
[ / "code"]

Sin comillas.

C

Esto pasa en el mundo real también. Sobre todo cuando cambias de lenguaje. Especialmente entre VB y C.

Que levante la mano quien no se ha tirado un rato largo depurando un error indetectable y se ha topado con que ha puesto asignación en vez de comparación xDDD

Usuarios habituales