2012-07-16 17 views
8

W GNUC C można użyć typeof(expression) i używanie wyrażenia zawierającego efekty uboczne jest legalne. Tak na przykład można mieć ten kod C:Efekty uboczne w wyrażeniu typeof()

int x = 0; 
typeof(x++) y; 

W tym przypadku, efektem ubocznym jest ignorowany, a x jest nadal zera potem (to sens jako typy są kompilacji tylko rzecz).

Jednak GCC documentation mówi:

Argument z typeof jest oceniany pod kątem jego skutków ubocznych wtedy i tylko wtedy, gdy jest wyrazem zmiennie zmodyfikowanego typu lub nazwa takiego typu.

Co oznacza to zdanie? Czy naprawdę można napisać typeof z efektem ubocznym i czy efekt uboczny faktycznie zostanie wykonany w czasie wykonywania? Dla mnie to zdanie wydaje się wskazywać na to.

+0

http://stackoverflow.com/q/4436889/195488 –

+1

@ 0A0D To pytanie również mówi o 'typeof', ale nie wspomina o efektach ubocznych, tylko wyrażeń wolnych od efektów ubocznych. –

+0

@PhilippWendler: Świetne pytanie! – pje

Odpowiedz

9

Tak, możliwe jest, że w niektórych przypadkach oceniane są efekty uboczne w zakresie typeof. Jak mówi dokumentacja, musi być w "zmiennie zmodyfikowanym typie". Jest to typ, który zależy od pewnej wartości runtime, takiej jak int[x].

więc następujący kod jest legalny, deklaruje y, aby być typu int[1] i x ma wartość 1, potem:

int x = 0; 
typeof(int[++x]) y; 

oczywiście równie do zmiennie zmodyfikowane typy w ogóle, to tylko prawną lokalne deklaracje zmiennych (funkcja wewnętrzna).

+3

Należy zauważyć, że jest to to samo, co w przypadku 'sizeof': operand wyrażenia nie jest analizowany, chyba że pojawia się tablica o zmiennej długości, a wartość rozmiaru tablicy wpływa na wynik wyrażenia' sizeof'. – ouah