Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z interpetacją kodu

Ostatnio zmodyfikowano 2016-02-21 21:05
Autor Wiadomość
Macioro
Temat założony przez niniejszego użytkownika
Problem z interpetacją kodu
» 2016-02-21 01:24:02
Witam, mam problem z dokładaną interpretacją poniższego kodu:
C/C++
int a = 6;
int b = 8;

int main()
{
    int a = 2, b = 5;
    cout <<[ a, b ]( int a, int b )->int { return::a + b; }( 18, - 7 );
    return 0;
}
Wartośc wyświetlana to 11, jednak czy mógłby mi ktoś dokładnie objaśnić co dzieje się po "coucie"??
P-145097
Monika90
» 2016-02-21 09:46:13
Bug w kompilatorze, według mnie powinno wyświetlić -1.
P-145101
Gibas11
» 2016-02-21 11:50:54
@up Dlaczego? Mi tam 11 pasuje, ale może o czymś nie wiem.

@autor Co dokładnie wyjaśnić, nie rozumiesz tego kawałka kodu (jeżeli tak to odsyłam do kawałku kursu o wyrażeniach lambda: http://cpp0x.pl/kursy/Kurs-C++​/Poziom-X​/Wyrazenia-lambda-C++11/423), czy nie pasuje Ci wynik?
P-145105
Monika90
» 2016-02-21 12:22:25
Znany i lubiany bug https://gcc.gnu.org/bugzilla​/show_bug.cgi?id=57443

A jeśli ktoś nie wie dlaczego powinno być -1, to niech sobie przeanalizuje ten przykład
C/C++
#include <iostream>

int a = 6;
int b = 8;

struct Closure
{
    int a = 2;
    int b = 5;
    int operator ()( int a, int b ) const { return::a + b; }
};

int main()
{
    std::cout << Closure { }( 18, - 7 );
}
P-145107
Rashmistrz
» 2016-02-21 21:05:10
» Kurs C++ » Poziom XWyrażenia lambda (C++11) lekcja
______________________

EDIT:
Sprawdziłem coś... (kompilator online)

Ten kod zwraca "11":
C/C++
#include <iostream>
using std::cout;

int a = 6;
int b = 8;

int main()
{
    int a = 2, b = 5;
    cout <<[ a, b ]( int a, int b )->int { return::a + b; }( 18, - 7 );
    return 0;
}

Jednakże ten kod zwraca "-1":
C/C++
#include <iostream>
using std::cout;

int a = 6;
int b = 8;

int main()
{
    int a = 2, b = 5;
    cout <<[]( int a, int b )->int { return::a + b; }( 18, - 7 );
    return 0;
}


Różnią się one jedną linijką:
cout <<[ a, b ]( int a, int b )->int { return::a + b; }( 18, - 7 );
.
cout <<[]( int a, int b )->int { return::a + b; }( 18, - 7 );
.
W kursie(link podałem na początku tego postu) nie jest w ogóle wspomniane
co można wpisać w kwadratowe nawiasy, ani co wpisanie tam czegokolwiek zmienia...
Trzymając się kursu, poprawna będzie linijka kodu z wersji drugiej.
______________________________________________________________________________________

jednak czy mógłby mi ktoś dokładnie objaśnić co dzieje się po "coucie"??
Owszem.

...

Właściwie mógłbym dalej już nie pisać,
bo odpowiedziałem na twoje pytanie,
ale to by było złe z mojej strony... >:D

Na początku tego postu zamieściłem link do fragmentu kursu.
Tam właściwie znajdziesz wszystko co jest Ci potrzebne.

Jednak warto zwrócić uwagę na ten fragment:
return::a + b;
.
Dodanie operatora zakresu przed a sprawia,
że nie jest brany argument a z funkcji lambda,
natomiast brana jest wartość zmiennej globalnej a.

Ten oto prosty przykład powinien rozwiać wszelkie wątpliwości co do tego fragmentu:
C/C++
namespace NamespaceA
{
    int x;
}

int x;

int main()
{
    int x;
   
    // the x in main()
    x = 0;
   
    // the x in the global namespace
    ::x = 1;
   
    // the x in the A namespace
    NamespaceA::x = 2;
}
P-145134
« 1 »
  Strona 1 z 1