2012-11-03 11 views
6

Powiel możliwe:
why does 3,758,096,384 << 1 gives 768C++ Co oznacza "int x = (anyInt1, anyInt2);" oznaczać?

Dziś dowiedziałem się, że następujący kod kompiluje z gcc:

#include <iostream> 

int main() 
{ 
    int x = (23,34); 

    std::cout << x << std::endl; // prints 34 

    return 0; 
} 

Dlaczego ten kompiluje? Jakie jest znaczenie (..., ...)?

+1

Oczywiście prawdziwe znaczenie ma to, że jakiś inteligentny tyłek użył operatora przecinka, co jest bardzo rzadko uzasadnione. – Yakk

Odpowiedz

8

W C++ , jest operatorem, a więc (23,34) jest wyrazem jak (23+34) jest wyrazem. W pierwszym z nich operator jest ,, podczas gdy w drugim, + jest operatorem.

Tak więc wyrażenie (23,34) ocenia prawy operand, który jest 34, dlatego Twój kod wyprowadza 34.

Chciałbym również wspomnieć, że , nie jest operatorem w wywołaniu funkcji:

int m = max(a,b); 

Tutaj , działa separator argumentów. Nie działa jako operator. Więc przekazujesz dwa argumenty do funkcji.

Jednakże

int m = max((a,b), c); 

tu pierwszy , jest operator, i drugi , jest separator. Więc nadal przekazujesz dwa argumenty do funkcji, a nie trzy, i jest to równoważne:

int m = max(b, c); //as (a,b) evaluates to b 

Nadzieję, że pomaga. :-)

+3

Mała uwaga dotycząca roli nawiasów w tym przykładzie byłaby pomocna, ponieważ operator ma niższy priorytet = operator. int x = 23,34; nie skompilowałbym się w ogóle. – Tomek

+0

@Tomek: Dobra uwaga. Dzięki. Mam nadzieję, że czytelnicy zobaczą również Twój komentarz. – Nawaz

+1

Dotyczy to również C. –

14

W wyrażeniu operator przecinka oceni wszystkie operandy i zwróci ostatnie. Dlatego w swojej przykład x jest równa 34.

+0

A nawiasy są jak w przypadku użycia, jeśli na przykład sentances, do instrukcji grupowych. – mrbrdo

+0

Ah, tak. Zapomniałem, że w języku C++ istnieje przecinek. thx – pwks