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

Przekazywanie argumentów do funkcji w dodatkowym nawiasie

Ostatnio zmodyfikowano 2017-03-02 15:13
Autor Wiadomość
Anim
Temat założony przez niniejszego użytkownika
Przekazywanie argumentów do funkcji w dodatkowym nawiasie
» 2017-03-02 14:06:38
W którymś z wątków z poprzednich dni pojawił się taki kod:

C/C++
#include <iostream>
using namespace std;

int A, B;
int dod( int liczba );

int main() {
   
    cin >> A;
    cin >> B;
   
    cout << dod(( A, B ) ) << endl;
   
    return 0;
}

int dod( int liczba )
{
    cout << liczba << endl;
    liczba = A + B;
    return liczba;
}

Oczywiście pomińmy, że kod jest napisany okropnie. Jednak chciałbym spytać, dlaczego konstrukcja dod((A,B)) nie zwraca błędu i traktuje to jako jeden argument? Dodatkowo dlaczego kompilator uznał, że należy przekazać do funkcji parametr B, a nie A? Pierwszy raz się z czymś takim spotkałem ^^
P-158447
Monika90
» 2017-03-02 14:14:45
Normalnie przecinek w wywołaniu funkcji oddziela od siebie argumenty przekazywane tej funkcji. Dodatkowe nawiasy powodują jednak, że przecinek jest interpretowany jako operator przecinek (operator przecinek to coś innego niż przecinek separator elementów listy). Więc sprawdź sobie w jakiejś dokumentacji co robi operator przecinek.
P-158448
Anim
Temat założony przez niniejszego użytkownika
» 2017-03-02 14:31:23
Hm. Interesujące. Dziękuję :)

Tylko teraz mam dodatkowe pytanie: Czy jedyną własnością używania operatora przecinka jest "zaoszczędzenie" linii kodu? Bo rozumiem, że zawsze można zastąpić operator przecinka jedną bądź dwoma liniami dodatkowego kodu. Wnioskuję, że nie ma to "własności optymalizacyjnych" - a w związku z tym, czy używanie go nie jest po prostu "brzydką manierą" w C++. Jeśli jestem w błędzie to oczywiście proszę o wyprowadzenie z tego błędu ^^
P-158449
Monika90
» 2017-03-02 14:54:33
Te operator nie ma wielu sensowych zastosowań. W niektórych miejscach C++ wymaga jednego wyrażenia (np. warunek pętli while), operator przecinek pozwala upchnąć w takich miejscach więcej niż jedno wyrażenie, np.
C/C++
int c;
while( c = cin.get(), c != EOF && !isspace( c ) )
{
    foo( c );
}
Łatwo tu o nadużycia.

Pisanie
C/C++
if( p )
     ++x, ++y, ++z;

zamiast
C/C++
if( p )
{
    ++x;
    ++y;
    ++z;
}
to nadużycie.

I nie ma to żadnego wpływu na wydajność kodu.
P-158451
Anim
Temat założony przez niniejszego użytkownika
» 2017-03-02 15:13:12
Dziękuję :) Zamykam temat :)
P-158454
« 1 »
  Strona 1 z 1