Sortowanie przez wybór - poprawna kompilacja i wykonanie mimo błędu w kodzie

0

Witam

Czy możecie mi wyjasnić dlaczego ten kod działa.
Jak to możliwe że tab[n] gdzie n podczas kompilacji jest nieokreślone (chyba jego wartość wynosi zero w tym konkretnym przypadku) tworzy tablice o rozmiarze wprowadzonym podczas działania aplikacji ?
Tab jest przecież tablica statyczną a jej rozmiar jest określany przy kompilacji - czy się mylę?
Ponoć - niestety nie mam możliwości sprawdzenia - Visual Studio nie przepuszcza tego kodu i zgłasza błąd a Dev C++ nie, jak to możliwe?

#include <iostream>

using namespace std;

int main()
{
	int n;

	cout << "Podaj ilosc liczb: " << endl;
	cin >> n;

	int tab[n];

	for (int i = 0; i < n; i++)
	{
		cout << "Podaj liczbe " << (i + 1) << ": " << endl;
		cin >> tab[i];
	}


	int pointer = n;

	for(int i = 0; i<n;i++)
	{
		for(int j = 0; j<(pointer-1);j++)
		{
			if(tab[j]<tab[j+1])
			{
				swap(tab[j],tab[j+1]);
			}

		}
		pointer--;
	}

	for(int i = 0; i<n;i++)
	{
		cout<<"Liczba "<<(i+1)<<": "<<tab[i]<<endl;
	}


    return 0;
}

Ejjjjjjjjjjjjmen

4

To jest VLA i jest to opcja z języka C, dodana w standardzie z 1999. roku. Nie jest to poprawny kod C++, ale jest dostępny jako rozszerzenie w niektórych kompilatorach.

1

Dev-C++ zapewne korzysta z MinGW, czyli gcc, gdzie VLA istnieje jako niestandardowe rozszerzenie.

0

To dzięki VLA, jest to dodatek do C99 (w porównaniu do C89) którego nie przyjęto do prawdziwego C++.
Zamiast niej lepiej użyj prawdziwej tablicy dynamicznej albo std::vector.
Jak napisał @kq - nie jest to poprawny kod C++, ale jest dostępny jako rozszerzenie w niektórych kompilatorach.
Widoczne w Visual Stuido nie ma rozszerzenia VLA (domyślnie włączonego albo może sam VLA jest niezaimplementowany - nie wiem).

1 użytkowników online, w tym zalogowanych: 0, gości: 1