2017-01-18 38 views
8

W C operator jednoargumentowy plus nazywa się jednoargumentowy operator arytmetyczny i nie można go zastosować do wskaźników (norma C, 6.5.3.3 Jednoargumentowe operatory arytmetyczne).Jaki jest powód istniejącej różnicy między C i C++ w stosunku do jednoargumentowego operatora arytmetycznego +

1 Argument jednoargumentowych + lub - operatora mają arytmetyczną typu; operatora ~, typ całkowity; z! operator, skalarny typ .

Zatem program nie kompilacji

#include <stdio.h> 

int main(void) 
{ 
    int a = 10; 
    int *pa = &a; 

    printf("%d\n", *+pa); 

    return 0; 
} 

Jednakże C++ operator jednoskładnikowa, oraz mogą być stosowane do wskaźników (C++ Standard, 5.3.1 operatorzy Jednoargumentowe)

7 operand operatora unary + musi mieć wyliczenie arytmetyczne, niezablokowane , lub wskaźnik typu, a wynikiem jest wartość argumentu . Zintegrowana promocja jest wykonywana na operandach całkowych lub wyliczeniowych . Typ wyniku jest typem promowanego operandu.

Program ten pomyślnie się kompiluje.

#include <iostream> 

int main() 
{ 
    int a = 10; 
    int *pa = &a; 

    std::cout << *+pa << std::endl; 

    return 0; 
} 

Jaki jest powód utrzymania tej różnicy między C i C++?


Pytanie powstało, gdy odpowiadałem na pytanie Why size of int pointer is different of size of int array?. Zamierzałem pokazać, jak przekonwertować tablicę na wskaźnik w operatorze sizeof.

Początkowo chciałem napisać

sizeof(+array) 

Jednakże wyrażenie to jest nieważne w C. Więc musiałem napisać

sizeof(array + 0) 

i uważam, że jest taka różnica między C i C++ . :)

+6

Aby zezwolić na 'auto * p = + []() {};'? ;) – Jarod42

+4

@ Jarod42: Na pewno masz na myśli 'auto * _ = + []() {};'? –

+4

Istotne: http://stackoverflow.com/questions/9266648/unary-onpointpoint – SingerOfTheFall

Odpowiedz

1

Różne języki mogą dołączać różne semantyki do tej samej składni.

C i C++ to różne języki o wspólnym przodku. Semantyka C++ wygląda na zwodniczo podobną, ale są subtelnie różne dla niektórych części wspólnej składni. Kolejny ciekawy przypadek to:

if (sizeof(char) == sizeof(int)) { 
    printf("Hello embedded world\n"); 
} else { 
    if (sizeof('a') == sizeof(char)) 
     printf("This is C++ code\n"); 
    if (sizeof('a') == sizeof(int)) 
     printf("This is C code\n"); 
} 

Powodem C++, aby powiększyć składni C w przypadku jednoargumentowego + może być w celu umożliwienia niektórych rozszerzonych typów liczbowych być realizowane jako wskaźniki, albo po prostu ze względów symetrii .

Jak wspomina Jaa-c w komentarzu, +p jest wyrażeniem wyliczonym, natomiast p jest odniesieniem do p. Podałeś inny przykład, w którym + może być użyty do wymuszenia kontekstu wyrażeń.Pytanie brzmi, dlaczego pierwotni autorzy języka C nie dopuszczali unicestwionych + na typach innych niż numeryczne? Być może efekt uboczny pierwotnej implementacji pcc.

Należy zauważyć, że w Javascript jednostronny operator + może być stosowany do typów bez numerów i działa jako konwersja na numer.

-2

W moich rozważań:

C++ jest rodzajem języka obiektowego. Tak więc każdy typ danych może być traktowany jako "Klasa".

W języku C int jest jednym z "podstawowego typu danych C". Ale w C++ możemy uznać int jako klasę. Tak więc w C++ wskaźnik int i tablica int należą do różnych klas. W języku C zmienna wskaźnika int przechowywała inny adres zmiennej int. int tablicy nazwy zamiast adresu pierwszego elementu tej tablicy int. Tak więc w C mają one takie samo znaczenie.

Co do unarodowego opreatora "+", rozumiem język C++ jako: Każda klasa w C++ reprezentuje zbiór rzeczy. Wszystkie rzeczy w zestawie mają te same właściwości. A na każdym materiale można wykonać pewne operacje. Oczywiście te operacje są członkami funkcji klasy. Inną postacią w C++ jest to, że użytkownicy mogą przeciążyć operatora. Przeciążenie oznacza, że ​​możemy wykonać tę samą operację na różnych klasach. Na przykład: Mężczyzna je hamburgera. możemy przeładować akcję "Jedz" między kotami i szczurami: Kot to jedzenie szczura.

Tak jak C++ standardzie powiedzieć: „Argument operatora jednoargumentowego + mają arytmetyczne, unscoped wyliczenie lub typ wskaźnika, a wynik jest wartością argumentu.” To tylko przeciążenie dla operatora jednoargumentowego + w klasie bez zakodowanych wyliczeń i typ wskaźnika. "A wynik jest wartością argumentu" -> Chyba o to chodzi.

+1

'int' nie jest klasą w C++. – EJP

+0

Tak, ale C++ też nie jest dobrze zaprojektowanym językiem. Projektanci po prostu wyciskają wiele nowych funkcji, szczególnie funkcję OOP na język C. W rzeczywistości nie możemy zadawać pytań o funkcje menbera klasy int w C++, takie jak: int.what; ale trudno jest osądzić, że rzeczy w C reprezentują to, co w C++. Zasadniczo Wszystkie rzeczy w C jest podzestawem w C++. Jeśli traktujemy typy danych w C jak int, char ... jak Classes w C++, to po prostu lepiej dla zrozumienia. – 0x2333

+0

Cała ta gofra jest całkowicie i całkowicie nieistotna. Stwierdziłeś, że "int" może być uważane za klasę "w C++. Nie może. – EJP

-1

Nie dlatego, że to odpowiada na zadane pytanie, ale na pytanie chciałeś pokazać konwersję, użyłbym:

sizeof(&array[0]) 

który skutecznie samo jak (tablica + 0), ale jaśniej wskazuje "wskaźnik do pierwszego elementu". I wskazują, że (pod warunkiem, że matryca nie jest wielkości 1 w maszynie 64-bitowy), będzie taka sama jak sizeof (int) ubezpieczeniowy

sizeof(array) 

nie będzie taki sam.

+1

Nie zapewnia to odpowiedzi na pytanie. Po uzyskaniu wystarczającego [reputation] (http://stackoverflow.com/help/whats-reputation) będziesz mógł [comment] (http: // stackoverflow.com/help/privileges/comment) w dowolnym poście. Sprawdź również to [co mogę zrobić zamiast tego] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead). – thewaywewere

+0

'sizeof' a wskaźnik nigdzie nie jest gwarantowany równy' sizeof int', i inaczej nie jest w żaden sposób odpowiedzią. – EJP

+0

Prawidłowy wskaźnik sizeof() nie ma gwarancji sizeof (int), jednak sizeof (array [0]) IS sizeof (int), jeśli tablica jest tablicą int. Punkt mojego postu adresował OP "dlaczego to arrose" - pytanie powstało, gdy odpowiadałem na pytanie Dlaczego rozmiar wskaźnika int jest inny niż rozmiar tablicy int ?. Zamierzałem pokazać, jak przekonwertować tablicę na wskaźnik w operatorze sizeof. - demonstrujący, że tablica sizeof() (int) NIE jest równa wielkości() int (wskaźnik do pierwszej komórki). –