2010-12-07 41 views
2

gcc me donne lvalue non valide dans les erreurs d'affectation pour:gcc confus au sujet de ce qu'est une lvalue?

-2[(size_t *)new] = 0; 

Modification du code à ce qui suit rend disparaître:

((size_t *)new)[-2] = 0; 

mais pour autant que je peux dire, les deux sont 100% l'équivalent dans C. gcc n'a aucun problème à utiliser le premier dans les expressions non-lvalues. Est-ce juste un bug dans gcc? Je l'ai testé avec plusieurs versions et j'ai obtenu les mêmes résultats.

+1

chaque fois que je pense que je connais C, je vois des choses comme ça et je vais "wtf?" –

+0

Je savais qu'il est possible d'accéder à des tableaux comme ça, mais je ne savais jamais que quelqu'un le faisait comme ça ... – musiKk

+0

@SB: Non, c'est un WTF légitime. – Thanatos

Répondre

7

Je suis stupide. [] se lie plus étroitement que -, donc cette expression est en train de lire l'index 2 et de le nier.

+2

Etes-vous stupide, "une situation extraordinairement étroite qui n'est généralement pas applicable à l'audience mondiale d'Internet"? –

+3

Hm?Je n'ai pas supprimé la question parce que (1) je pensais que je méritais la honte de visser ça, et (2) la réponse est potentiellement intéressante et une bonne raison pour laquelle la construction que j'utilisais ne devrait probablement pas être utilisée les cas où je l'utilise, l'intention est de réduire les niveaux de parenthèses car j'ai des problèmes visuels/perceptuels en lisant des expressions avec trop de niveaux de parenthèses). –

+0

Bien que je ne recommanderais jamais d'utiliser 'index [ptr]' dans le code de production, je comprends votre raisonnement pour le faire, et franchement, je dois admirer tous ceux qui n'ont pas honte de profiter pleinement de l'étrangeté générale de C. C'est en fait une leçon très intéressante sur la priorité des opérateurs. –