En C, l'opérateur virgule ne produisent pas une lvalue, par conséquent, la matrice arr
qui est une lvalue se désintègre en un type pointeur qui est une rvalue (dans ce cas). Donc, sizeof(0,arr)
devient l'équivalent sizeof(char*)
, en raison de lvalue-à-rvalue de conversion.
Mais en C++, l'opérateur virgule produit une lvalue. Il n'y a pas de lvalue-à-rvalue de conversion. Donc, sizeof(0,arr)
reste la même, ce qui est équivalent à sizeof(char[100])
.
Par la voie, sizeof
n'est pas une fonction, c'est un opérateur. Donc la suite est tout à fait valable, C++ et C, si vous imaginez printf
au lieu de cout
):
int a[100], b[200], c[300], d[400];
cout << sizeof(a,b,c,d) << endl;
Démo : http://www.ideone.com/CtEhn
Vous pourriez penser que j'ai passé 4 opérandes sizeof
mais c'est faux. sizeof
fonctionne sur le résultat de la virgule opérateurs. Et ses parce que de nombreux virgule opérateurs, vous verrez de nombreux opérandes.
4 opérandes <=> 3 virgule opérateurs; tout comme en 1+2+3+4
, il y a 3 opérateurs, 4 opérandes.
Le ci-dessus est équivalente à la suivante (valable en C++0x):
auto & result = (a,b,c,d); //first all comma operators operate on the operands.
cout << sizeof (result) << endl; //sizeof operates on the result
Démo : http://www.ideone.com/07VNf
La virgule de l'opérateur qui vous fait sentir qu'il y a de nombreux arguments. Ici, la virgule est un opérateur, mais dans l'appel de fonction, la virgule n'est PAS un opérateur, il s'agit tout simplement de l'argument séparateur.
function(a,b,c,d); //here comma acts a separator, not operator.
Donc, sizeof(a,b,c,d)
fonctionne sur le type du résultat de l' ,
opérateurs, exactement de la même manière, sizeof(1+2+3+4)
fonctionne sur le type du résultat de l' +
opérateurs.
Notez également que vous ne peut pas écrire sizeof(int, char, short)
, précisément parce que la virgule opérateur ne peut pas fonctionner sur les types. Il fonctionne sur la valeur seulement. Je pense que, sizeof
est le seul opérateur en C et C++, qui peut fonctionner sur les types ainsi. En C++, il y a encore un opérateur qui peut fonctionner sur les types. Son nom est typeid
.