mam jakiś kod, który zasadniczo sprowadza się do następujących:Czy poprawnie zdefiniowano zmienną niezainicjowaną na liście parametrów funkcji?
void bar(bool b, double f)
{
if (b){
double g = f;
}
}
void foo()
{
double f;
bool b = false;
bar(b, f);
}
Czy istnieje niezdefiniowane zachowanie tutaj? Podejrzewam, że może być, ponieważ biorę kopię wartości niezainicjowanej double
, przekazując f
do bar
. Powiedział, że nie korzystam z przekazanego double
, ponieważ blok if
nie będzie działać.
Ponadto będzie wszystko w porządku, gdybym zdać double
przez odniesienie:
void bar(bool b, double& f)
to nie jestem „za” zmienną zainicjalizowana, ale jestem po prostu odnosi się do niego.
Nie masz niezdefiniowanego zachowania, dopóki nie spróbujesz uzyskać dostępu do zmiennej, a ponieważ jest to wykonywane podczas przekazywania wartości przez funkcję, masz niezdefiniowane zachowanie w wywołaniu. Jeśli zamiast tego przekazujesz referencję, masz niezdefiniowane zachowanie w funkcji, gdy uzyskasz dostęp do wartości referencyjnej. –
"używanie unitializowanej wartości nie jest samo w sobie nieokreślonym zachowaniem, ale jego wartość jest po prostu nieokreślona." (Od [tej odpowiedzi] (http://stackoverflow.com/a/11965368/96780)) –
@ Danielanasas * Jeśli lwartość wyznacza obiekt automatycznego czasu przechowywania, który mógł zostać zadeklarowany przy użyciu klasy pamięci rejestru (nigdy nie miał podjętego adresu), a obiekt ten nie został zainicjowany (nie został zadeklarowany za pomocą inicjalizatora i przed użyciem nie zostało wykonane przypisanie), ** zachowanie jest niezdefiniowane. *** A ta odpowiedź odnosi się do C btw. – 2501