56 votes

Peut-on avoir un triple signe moins en programmation C ? Qu'est-ce que cela signifie ?

Duplicata possible :
Pourquoi a+++++b ne fonctionne pas en C ?

J'ai trouvé cela à la page 113 du livre "An Embedded Software Primer" de David Simon.

J'ai vu cette déclaration ci-dessous :

iHoursTemp = iHoursTemp + iZoneNew ---iZoneOld;

Peut-on vraiment avoir trois signes moins dans cette ligne ? Que signifie un triple signe moins ?

Je crois que c'est une déclaration de programmation en C.

92voto

Robᵩ Points 50501

C'est équivalent à :

iHoursTemp = iHoursTemp + (iZoneNew--) - iZoneOld;

Ceci est conforme à la maximal-munch principe

49voto

imreal Points 5984

La réponse correcte est (comme l'a dit Rob) la suivante :

iHoursTemp = iHoursTemp + (iZoneNew--) - iZoneOld;

La raison pour laquelle c'est comme ça et pas

iHoursTemp = iHoursTemp + iZoneNew - (--iZoneOld);

est une convention connue sous le nom de stratégie de grignotage maximum qui dit que s'il y a plus d'une possibilité pour le prochain jeton, il faut utiliser (mordre) celui qui a le plus de caractères. Dans ce cas, les possibilités sont - y -- , -- est évidemment plus long.

12voto

Olaf Dietsche Points 35264

Selon Projet C++11 (PDF) 2.5 Prétraitement des tokens, clause 3 et Projet C11 (PDF) 6.4 Éléments lexicaux, clause 4, le compilateur analyse la plus longue séquence possible de caractères comme le prochain token.

Cela signifie que --- sera analysé en deux jetons -- y - ce qui donne

iHoursTemp = iHoursTemp + (iZoneNew--) - iZoneOld;

Cela montre également que si vous n'êtes pas sûr de la préséance ou des règles d'analyse, utilisez les parenthèses pour clarifier le code.

5voto

Jeyaram Points 4230

Est égal à

iHoursTemp = iHoursTemp + (iZoneNew--) -iZoneOld;

#include <stdio.h>

int main()
{

int iHoursTemp = 2, iZoneOld = 3, iZoneNew = 4;

//2+4 - 2 = 4
iHoursTemp = iHoursTemp + iZoneNew ---iZoneOld;
//2+(4--) -3 = 3   

printf("\n :%d \n", iHoursTemp);

return 0;

}

Donne 3 dans gcc.

-9voto

humblecoder Points 92

Bien sûr, pourquoi pas. Cette déclaration

iHoursTemp = iHoursTemp + iZoneNew ---iZoneOld;

est équivalent à

iHoursTemp = iHoursTemp + iZoneNew -(--iZoneOld); //first decrement iZoneOld then perform rest of the arithmetic operation.

Un petit casse-tête, mais amusant à écrire :-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X