Articles of undefined behavior

¿Pueden los diferentes dialectos de GCC vincularse?

Sé que, en principio, este es probablemente un comportamiento indefinido, pero en el interés de tratar con un gran proyecto, esta es mi pregunta sobre GCC: Supongamos que compilo una unidad de transacción con gcc -std=c++98 y otra con -std=c++11 , utilizando exactamente la misma instalación del comstackdor. ¿Hay algún tipo de garantía de que […]

¿El desplazamiento a la derecha aritmético da un resultado falso?

Debo estar absolutamente loco aquí, pero gcc 4.7.3 en mi máquina está dando el resultado más absurdo. Aquí está el código exacto que estoy probando: #include using namespace std; int main(){ unsigned int b = 100000; cout <>b) <> b; cout << b <>= b; cout << b << endl; return 0; } Ahora, cualquier […]

Comportamiento definido para expresiones

El estándar C99 dice en $ 6.5.2. Entre el punto de secuencia anterior y siguiente, un objeto tendrá su valor almacenado modificado a lo sumo por la evaluación de una expresión. Además, el valor anterior se leerá solo para determinar el valor que se almacenará . (énfasis por mí) Sigue diciendo que el siguiente ejemplo […]

C: ¿Cuándo está lanzando entre los tipos de puntero un comportamiento no indefinido?

Como recién llegado a C, estoy confundido acerca de cuándo lanzar un puntero está realmente bien. Según tengo entendido, puedes convertir cualquier tipo de puntero a cualquier otro tipo, y el comstackdor te permitirá hacerlo. Por ejemplo: int a = 5; int* intPtr = &a; char* charPtr = (char*) intPtr; Sin embargo, en general esto […]

¿Es legal pasar un objeto C ++ a su propio constructor?

Me sorprende descubrir accidentalmente que los siguientes trabajos: #include int main(int argc, char** argv) { struct Foo { Foo(Foo& bar) { std::cout << &bar << std::endl; } }; Foo foo(foo); // I can't believe this works… std::cout << &foo << std::endl; // but it does… } Estoy pasando la dirección del objeto construido en su […]

¿Por qué la inicialización de una nueva variable es válida en sí misma?

Considera un código: #include int main() { using std::cout; int a=3; cout << "a="<<a<<"\n"; { int a=a; cout << "new a = " << a << "\n"; a=5; cout << "a = " << a << "\n"; } cout << "old a = " << a << "\n"; } Esperaría que imprima a=3 new a […]

¿Cómo explicamos el resultado de la expresión (++ x) + (++ x) + (++ x)?

x = 1; std::cout << ((++x)+(++x)+(++x)); Espero que la salida sea 11 , pero en realidad es 12 . ¿Por qué?

¿Por qué esta afirmación no funciona en java x ^ = y ^ = x ^ = y;

int x=1; int y=2; x ^= y ^= x ^= y; Estoy esperando que los valores sean intercambiados. Pero da x = 0 y y = 1. cuando probé en lenguaje C, da el resultado correcto.

En C99, ¿es f () + g () indefinido o simplemente no especificado?

Solía ​​pensar que en C99, incluso si los efectos secundarios de las funciones f y g interferían, y aunque la expresión f() + g() no contiene un punto de secuencia, f y g contendrían algo, por lo que el comportamiento sería no especificado: o f () se llamaría antes de g (), o g () […]

Entonces, ¿por qué i = ++ i + 1 está bien definido en C ++ 11?

He visto las otras preguntas similares y leí el defecto al respecto. Pero todavía no lo entiendo ¿Por qué i = ++i + 1 bien definido en C ++ 11 cuando i = i++ + 1 no? ¿Cómo el estándar lo hace bien definido? Al hacer ejercicio, tengo la siguiente secuencia antes del gráfico (donde […]