• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ wskaźniki odc 10

VPS Starter Arubacloud
0 głosów
197 wizyt
pytanie zadane 9 marca 2017 w C i C++ przez Geralt_z_Rivii Nowicjusz (240 p.)

Cześć, przez przypadek przepisując pierwszy program z odcinka 10 dałem średnik po pętli for.
Zaowocowało to tym, że program wypisuje jedną liczbę, zamiast kilku. 
Nie rozumiem dlaczego, czy ktoś mógłby mi wytłumaczyć?

 

#include <iostream>

using namespace std;

int ile;

int main()
{
    cout << "Ile liczb w tablicy? ";
    cin>>ile;

    int *tablica;
    tablica = new int [ile];

    for(int i=0; i<ile; i++);
    {
        cout<<(int)tablica<<endl;
        tablica++;
    }

    delete [] tablica;
    tablica=NULL;

    return 0;
}

 

2 odpowiedzi

+3 głosów
odpowiedź 9 marca 2017 przez niezalogowany

Ten kod nie ma sensu:

t.cpp: In function ‘int main()’:
t.cpp:18:49: error: cast from ‘int*’ to ‘int’ loses precision [-fpermissive]
                                      cout<<(int)tablica<<endl;

Oraz zawiera błędy (tak, MZ napisał ten kod BŁĘDNIE, bo przy delete wskaźnik powinien wskazywać na początek tablicy)

Średnik powoduje, że sam for jest traktowany jako pojedyncza instrukcja, co dobrze widać w kodzie maszynowym dlaczego nie wykonywane są wszystkie inne:

   0x00000000004009b6 <+0>:	push   rbp
   0x00000000004009b7 <+1>:	mov    rbp,rsp
   0x00000000004009ba <+4>:	sub    rsp,0x20
   0x00000000004009be <+8>:	mov    esi,0x400b54
   0x00000000004009c3 <+13>:	mov    edi,0x6011a0
   0x00000000004009c8 <+18>:	call   0x400860 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
   0x00000000004009cd <+23>:	mov    esi,0x6012b4
   0x00000000004009d2 <+28>:	mov    edi,0x601080
   0x00000000004009d7 <+33>:	call   0x400870 <_ZNSirsERi@plt>
   0x00000000004009dc <+38>:	mov    eax,DWORD PTR [rip+0x2008d2]        # 0x6012b4 <ile>
   0x00000000004009e2 <+44>:	cdqe   
   0x00000000004009e4 <+46>:	movabs rdx,0x1fc0000000000000
   0x00000000004009ee <+56>:	cmp    rax,rdx
   0x00000000004009f1 <+59>:	ja     0x4009f9 <main()+67>
   0x00000000004009f3 <+61>:	shl    rax,0x2
   0x00000000004009f7 <+65>:	jmp    0x400a00 <main()+74>
   0x00000000004009f9 <+67>:	mov    rax,0xffffffffffffffff
   0x0000000000400a00 <+74>:	mov    rdi,rax
   0x0000000000400a03 <+77>:	call   0x400810 <_Znam@plt>
   0x0000000000400a08 <+82>:	mov    QWORD PTR [rbp-0x10],rax
   0x0000000000400a0c <+86>:	mov    rax,QWORD PTR [rbp-0x10]
   0x0000000000400a10 <+90>:	mov    QWORD PTR [rbp-0x8],rax
   0x0000000000400a14 <+94>:	mov    DWORD PTR [rbp-0x14],0x0
   0x0000000000400a1b <+101>:	mov    eax,DWORD PTR [rip+0x200893]        # 0x6012b4 <ile>
   0x0000000000400a21 <+107>:	cmp    DWORD PTR [rbp-0x14],eax
   0x0000000000400a24 <+110>:	jge    0x400a2c <main()+118>
   0x0000000000400a26 <+112>:	add    DWORD PTR [rbp-0x14],0x1
   0x0000000000400a2a <+116>:	jmp    0x400a1b <main()+101>
   0x0000000000400a2c <+118>:	mov    rax,QWORD PTR [rbp-0x10]
   0x0000000000400a30 <+122>:	mov    eax,DWORD PTR [rax]
   0x0000000000400a32 <+124>:	mov    esi,eax
   0x0000000000400a34 <+126>:	mov    edi,0x6011a0
   0x0000000000400a39 <+131>:	call   0x400800 <_ZNSolsEi@plt>
   0x0000000000400a3e <+136>:	mov    esi,0x4008a0
   0x0000000000400a43 <+141>:	mov    rdi,rax
   0x0000000000400a46 <+144>:	call   0x400890 <_ZNSolsEPFRSoS_E@plt>
   0x0000000000400a4b <+149>:	add    QWORD PTR [rbp-0x10],0x4
   0x0000000000400a50 <+154>:	cmp    QWORD PTR [rbp-0x8],0x0
   0x0000000000400a55 <+159>:	je     0x400a63 <main()+173>
   0x0000000000400a57 <+161>:	mov    rax,QWORD PTR [rbp-0x8]
   0x0000000000400a5b <+165>:	mov    rdi,rax
   0x0000000000400a5e <+168>:	call   0x400880 <_ZdaPv@plt>
   0x0000000000400a63 <+173>:	mov    QWORD PTR [rbp-0x10],0x0
   0x0000000000400a6b <+181>:	mov    eax,0x0
   0x0000000000400a70 <+186>:	leave  
   0x0000000000400a71 <+187>:	ret    

komentarz 9 marca 2017 przez tangarr Mędrzec (154,780 p.)
Ten kod wyświetla wartość wskaźnika.
Twój warning oznacza, że pracujesz na systemie 64bitowym (więc wskaźniki też mają długość 64 bajtów) i typ int (32 bitowy) może nie pomieścić całej wartości.
+2 głosów
odpowiedź 9 marca 2017 przez tangarr Mędrzec (154,780 p.)
Po wykonaniu pętli (czyli zwiększeniu i do ile) program wykonuje następną instrukcję (czyli blok kodu zaczynający się w 16 linijce).

Podobne pytania

0 głosów
3 odpowiedzi 198 wizyt
pytanie zadane 8 grudnia 2017 w C i C++ przez dretred Nowicjusz (180 p.)
+1 głos
2 odpowiedzi 265 wizyt
pytanie zadane 8 stycznia 2016 w C i C++ przez Wojtek Brzeziński Nowicjusz (170 p.)
0 głosów
1 odpowiedź 522 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...