Articles of undefined behavior

¿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 […]

¿Por qué char * causa un comportamiento indefinido mientras que char no?

Intentar modificar un literal de cadena provoca un comportamiento indefinido: char * p = “wikipedia”; p[0] = ‘W’; // undefined behaviour Una forma de evitar esto es definirlo como una matriz en lugar de un puntero: char p[] = “wikipedia”; p[0] = ‘W’; // ok ¿Por qué char* causa un comportamiento indefinido, mientras que char[] […]

Matriz de acceso más allá del límite en C y C ++

int data[8]; data[9] = 1; ¿Qué dice el estándar de C ++ al respecto? ¿Es este comportamiento indefinido? Al menos el comstackdor C (gcc -std = c99 -pedantic -W -Wall) no dice nada al respecto. Gracias.

¿Por qué es un comportamiento indefinido eliminar una matriz de objetos derivados a través de un puntero base?

Encontré el siguiente fragmento en el estándar C ++ 03 en 5.3.5 [expr.delete] p3 : En la primera alternativa ( eliminar objeto ), si el tipo estático del objeto a eliminar es diferente de su tipo dynamic, el tipo estático será una clase base del tipo dynamic del operando y el tipo estático tendrá un […]

¿Es correcto cambiar el comportamiento indefinido si el recuento es más grande que el ancho del tipo?

Acabo de comprobar el estándar de C ++ . Parece que el siguiente código NO debe ser un comportamiento indefinido : unsigned int val = 0x0FFFFFFF; unsigned int res = val >> 34; // res should be 0 by C++ standard, // but GCC gives warning and res is 67108863 Y del estándar: El valor […]