Des accolades "just pour le fun" ? [C] - C - Programmation
Marsh Posté le 04-01-2007 à 15:06:31
MagicBuzz a écrit : Je suis en train de lire des sources en C (ou C++, j'en sais pouic, ça a changé en cours de route )
|
non ca sert pas a faire joli, ca s'appelle un scope. Sortie de la zone des {} les variables ne sont plus accessibles donc tu économises de la ram.
Marsh Posté le 04-01-2007 à 15:13:01
MagicBuzz a écrit :
|
oh putain, un monguer qui se met à fairte du C
Marsh Posté le 04-01-2007 à 15:18:50
Tamahome a écrit : non ca sert pas a faire joli, ca s'appelle un scope. Sortie de la zone des {} les variables ne sont plus accessibles donc tu économises de la ram. |
Ca évite également d'avoir une définition d'une variable, soit en plein milieu du code, soit en début de fonction alors que la variable ne sert que dans une partie très restreinte de la fonction.
Bref, ça peut aussi servir à améliorer la lisibilité du programme.
Marsh Posté le 04-01-2007 à 15:22:36
Elmoricq a écrit : Ca évite également d'avoir une définition d'une variable, soit en plein milieu du code, soit en début de fonction alors que la variable ne sert que dans une partie très restreinte de la fonction. |
tu peux aussi t'en servir pour "masquer" la définition d'une variable existante... alors la lisibilité...
Marsh Posté le 04-01-2007 à 15:27:35
Je parle bien de "possibilité", pour la lisibilité.
C'est juste un argument de plus en faveur du fait que les accolades sont pas là pour faire beau.
Marsh Posté le 04-01-2007 à 15:27:56
ReplyMarsh Posté le 04-01-2007 à 15:28:22
Tamahome a écrit : tu peux aussi t'en servir pour "masquer" la définition d'une variable existante... alors la lisibilité... |
Non, moi je dis non.
Certes on peut très bien utiliser les particularités de certaines syntaxes pour polluer un programme... mais mis à part dans certaines réunions, ce n'est généralement pas dans ce but là qu'on utilise ces syntaxes.
Pour ma part, je tend à croire que celui qui utilisera un raccourci syntaxique dans son programme le fera dans un but utilitaire (économie de mémoire, économie algorithmique, optimisation, etc...) et non pas pour pourir la vie de celui qui va le relire...
Marsh Posté le 04-01-2007 à 17:59:17
MagicBuzz a écrit : sinon, pour le coup du monguer et du = suivit d'un = avec un + ça quoi ce charabiat ? à la base, c'est un prog open source, et y'a un bug par là dedans. le bug tout con à la base, je me dis "allez, tiens, chuis dans un grand jour, je vais filer un coup de main". mais là c'est mal parti sur 10 lignes j'en pige une et demie |
Bon, déjà, "a += b" est un raccourci qui signifie "a = a + b" (on peut donc faire a -= b, a /= b, a *= b, a &= b, etc).
Quant au code sur lequel tu t'interroges, c'est ultra-simple : dans l'expression "a || b", si a est vrai, alors la condition b n'est pas évaluée (idem pour "a && b" : si "a" est faux, alors "b" n'est pas évalué).
A partir de là, c'est facile de voir ce que fait le code
Marsh Posté le 04-01-2007 à 18:28:45
et ça correspond à quoi les conditions avec des , au milieu ?
Marsh Posté le 04-01-2007 à 20:09:11
truc du jour : en C, un statement renvoie une valeur.
donc a = 20 va renvoyer à un membre gauche 20 (il y est pas, mais si, c'est vrai, tu peux l'affecter, comme
Code :
|
fait une double affectation.
Code :
|
Marsh Posté le 04-01-2007 à 20:15:46
la même principe marche aussi pour
Code :
|
L'expression A>20 est évaluée. Si elle retourne true, c'est pas la peine de continuer dans le OU, donc l'affectation b=10 n'est pas réalisée. Si elle retourne false, on va continuer d'évaluer l'espression, donc réaliser l'affectation.
Marsh Posté le 04-01-2007 à 20:18:52
MagicBuzz a écrit :
|
La première fois que tu l'a écrit en parlant de C# j'ai cru que or était un keyword standard pour ||, ça faisait une soupe assez bizarre à comprendre...
(d'ailleurs ça peut faire mal une variable 'or' si quelqu'un inclut <iso646.h>, qui est un header standard (c99)...)
Marsh Posté le 04-01-2007 à 20:53:48
la , en C est l'opérateur séquentiel, ça veut dire fait ce qu'il y a avant, puis fait ce qu'il y a après, puis renvoie la valeur de ce qu'il y a après.
donc :
rating += 10
age >= 1 (aucun effet de bord)
et enfin: renvoie la valeur de "age >= 1"
( c'est assez rarement utilisé à vrai dire, pour des raisons de lisibilités surtout )
Marsh Posté le 04-01-2007 à 20:56:33
0x90 a écrit : |
le seul cas ou je le vois dans la vraie vie, c'est dans les inits de boucle for.
Marsh Posté le 04-01-2007 à 21:02:50
Bon.
Tu poses cette question :
MagicBuzz a écrit : sinon, pour le coup du monguer et du = suivit d'un = avec un + ça quoi ce charabiat ? |
J'y réponds et, tu remarqueras, sans aucune allusion n'y rien, malgré la trivialité de la question. J'y réponds, tout simplement.
Et je me mange ça :
MagicBuzz a écrit : nan, mais c'est bon, je suis pas mongolien non plus. a += 20; je sais parfaitement ce que ça fait. |
C'est la seconde fois que je te vois te ramener avec tes gros sabots dans la catégorie C et que je subis ton arrogance.
Alors tu sais quoi ? A partir de maintenant, tu peux aller te faire foutre avec tes questions.
Marsh Posté le 04-01-2007 à 21:05:16
Un truc du genre :
rating += 3*(age<1)+(3-(age>3?3:age))*10;
Ça peut le faire aussi
Marsh Posté le 04-01-2007 à 21:10:15
J'ai cité ta question, pourtant, je me trompe où ?
edit : le fourbe, il a édité sa réponse
Marsh Posté le 04-01-2007 à 21:17:36
Bon, ok, 'dmettons que je me sois enflammé.
"a = b = c + 2" signifie : "c+2 assigné à b, puis b assigné à a"
En plus simple, on peut initialiser en cascade, comme suit : "a = b = c = d = 1;"
J'crois que c'est aussi possible en C#.
Marsh Posté le 05-01-2007 à 00:14:59
MagicBuzz a écrit : avec des valeurs séparées par des virgules, ça se sert habituellement pour passer des paramètres à une fonction |
La virgule est un opérateur, tout comme le signe "+", "<", "&" et bien d'autres encore.
Ca sert à séquentialiser les opérations.
Peut-être que tu as l'habitude de le voir dans les paramètres d'une fonction mais on peut le trouver dans bien d'autres instructions...
int i=0, j=0, k=0;
for (i=0, j=10; i < 100; i++, j--)
free(p), p=NULL;
Tu peux même l'y mettre juste pour pourir la vie des autres programmeurs qui bossent avec toi
i=(j=2, 1);
Ce qui est une manière tordue d'écrire
i=1;
j=2;
...
elianor a écrit : la même principe marche aussi pour
|
C'est parfaitement vrai... mais dans le principe je trouve un peu "bancal" de chercher un truc faux pour faire l'affectation.
D'un point de vue purement "logique", je verrais plutôt ça comme "je fais l'affectation si l'assertion est vraie"
Code :
|
Ceci dit, cela n'enlève rien à la valeur pédagogique de l'exemple qui ne m'était jamais venue à l'esprit...
Marsh Posté le 05-01-2007 à 00:17:24
dans les paramètres d'une fonction ce n'est pas un opérateur cela dit.
Marsh Posté le 05-01-2007 à 00:25:38
0x90 a écrit : dans les paramètres d'une fonction ce n'est pas un opérateur cela dit. |
Ah ??? C'est peut-être vrai si tu le dis... mais sincèrement je ne trouve aucun empêchement quelconque à ce que ce soit aussi un opérateur même dans les paramètres.
En effet, lorsque les paramètres sont évalués, ils le sont séquentiellements ce qui correspond donc parfaitement à la fonction de la virgule qui est de séquentialiser ses éléments...
Marsh Posté le 05-01-2007 à 00:48:24
MagicBuzz a écrit : y'a pas des options de compilation (comme en C#) qui permet d'empêcher ça ? |
Non, parce que c'est autorisé en C. Par contre gcc a une option pour signaler le shadowing... : -Wshadow
cette option est dans mon mode paranoïaque :
http://mapage.noos.fr/emdel/codage.htm#cfg_compilo_gcc
Marsh Posté le 05-01-2007 à 00:55:17
Sve@r a écrit : sincèrement je ne trouve aucun empêchement quelconque à ce que ce soit aussi un opérateur même dans les paramètres. |
Sauf que pour des paramètres, l'ordre d'évaluation n'est pas défini... Grosse différence avec l'opérateur virgule (comma operator)
Marsh Posté le 05-01-2007 à 01:04:36
Emmanuel Delahaye a écrit : Sauf que pour des paramètres, l'ordre d'évaluation n'est pas défini... Grosse différence avec l'opérateur virgule (comma operator) |
J'étais entrain d'aller vérifier dans la norme, tu sais pas ou c'est dedans par hasard ? (à moins que ce soit uniquement spécifié par la non spécification d'un sequence point au moment ou ils parlent de la sémantique d'une définition de fonction)
Marsh Posté le 05-01-2007 à 01:08:21
MagicBuzz a écrit :
|
Pour s'économiser l'appel à sprintf
(après, effectivement est-ce que l'optim est bien nécessaire, j'en doute fortement... mais vu qu'OTTD c'est codé par des assembleux spa étonnant ce genre d'optim, même moi ça me fait mal au coeur les appels à sprintf pour ça )
Marsh Posté le 05-01-2007 à 01:19:01
Emmanuel Delahaye a écrit : Sauf que pour des paramètres, l'ordre d'évaluation n'est pas défini... Grosse différence avec l'opérateur virgule (comma operator) |
Tiens ? Maintenant que tu le dis, c'est vrai que j'ai déjà eu des surprises avec ce genre de truc
printf("%d %d %d\n", i++, i++, i++)...
Marsh Posté le 05-01-2007 à 01:29:35
0x90 a écrit : à moins que ce soit uniquement spécifié par la non spécification d'un sequence point au moment ou ils parlent de la sémantique d'une définition de fonction |
C'est ça.
Marsh Posté le 05-01-2007 à 01:30:28
Sve@r a écrit : printf("%d %d %d\n", i++, i++, i++)... |
Horrible ! Comportement indéfini.
Marsh Posté le 05-01-2007 à 01:31:06
Emmanuel Delahaye a écrit : C'est ça. |
Ah, jl'ai trouvé en explicite, 6.5.2.2.10 \o/
Marsh Posté le 06-01-2007 à 10:33:13
Pour un catalogue des joyeusetés, voir http://www.literateprogramming.com/ctraps.pdf
Marsh Posté le 06-01-2007 à 10:41:43
tbp a écrit : Pour un catalogue des joyeusetés, voir http://www.literateprogramming.com/ctraps.pdf |
Archivaid. Merci.
Marsh Posté le 06-01-2007 à 11:34:43
MagicBuzz a écrit : ah ok en plus ça existe en C# aussi, ça me revient |
Et tu as tort.
Toujours limiter la taille des portées/scopes: le code est plus clair (car les variables sont plus localisées), et plus rapide, car les variables sont sur la pile. Enfin pas en C# et en Java, mais en tout cas tu sollicites bcp moins le GC, puisque la durée de vie des variables s'arrête à la sortie de la portée. (D'aileurs, tu n'es pas sans savoir que ces varaibles s'appellent historiquement des variables automatiques, parce qu'elles sont automatiquement détruites à la sortie du scope.)
Les GC, c'est bien, mais il est tjrs bon de leur faciliter le travail au maximum.
(et oui, le 1er bout de code que tu as montré est assez moche)
Marsh Posté le 08-01-2007 à 11:07:55
MagicBuzz a écrit : Sauf que moi j'utilise les règles de dev établies par IBM : pas plus de 10 lignes par fonction dans la mesure du possible. |
10, c'est pas beaucoup. D'expérience, 25 est une bonne limite.
Citation : |
Alors on est d'accord.
Citation : |
Le GC (Garbage Collector, je suppose) n'a rien à voir là dedans... Ca ne concerne que la mémoire allouée dynamiquement. En plus, en C, ça n'existe pas en natif.
Marsh Posté le 08-01-2007 à 12:13:30
MagicBuzz a écrit : je parle pour le C# puisque je bosse en C# |
Alors par pitié, parles de ce que tu connais et arrêtes de divaguer sur le C. La drogue çay mal tu sais.
Marsh Posté le 08-01-2007 à 12:13:32
MagicBuzz a écrit : je parle pour le C# puisque je bosse en C# |
Sur un forum C. Mais c'est supair !
depuis, le projet en C sur lequel je fais des petits devs, là, ne supporte pas la déclaration tardive. je ne sais pas si c'est typique au C ou un paramètre du projet, mais en tout cas, "for (int i = ...)" lève une erreur de compilation.
Bah, cette construction fonctionne en C99. Mais en C90, on fait un bloc et c'est tout.
Code :
|
Citation : |
[C]
Pas si on utilise les variables locales (pas trop grandes). Mais ça dépend de l'usage. Parfois, il faut retourner l'adresse d'un objet alloué dynamiquement. J'espère que le GC ne vient pas se mêler de ce qui ne le regarde pas...
Citation : genre la création d'une variable dans une boucle, en C, c'est parfaitement horrible niveau perfs, il faut toujours la déclarer en dehors du scope de la boucle. en C#, ça ne pose pas de problème. |
Tu sors ça d'où ? Tu as fait des mesures ? Tu peux le prouver.
Marsh Posté le 08-01-2007 à 12:33:29
MagicBuzz a écrit : Car dans le premier cas à chaque itération le programme va se faire chier allouer un espace mémoire pour la string, puis la désaouler. |
J'espère qu'il y une injonction t'interdisant d'approcher un compilateur C à moins de 10m, sinon on est perdu.
C'est assez fascinant de voir combien le fait de ne rien paner au C ne t'empeche en rien de pontifier.
Marsh Posté le 08-01-2007 à 12:57:19
MagicBuzz a écrit : fait ça en C :
|
Comportement indéfini. Reviens ici quand tu saura de quoi tu parles...
On va pas d'embéter sur le forum C#, OK ?
Le code manquant est ici :
http://mapage.noos.fr/emdel/clib.htm
Module CHRO (et les autres si nécessaire...)
Code :
|
|
Un léger overhead, c'est possible. Pas de quoi se taper le cul par terre...
Marsh Posté le 08-01-2007 à 13:48:09
Emmanuel Delahaye a écrit : Un léger overhead, c'est possible. Pas de quoi se taper le cul par terre... |
Bruit dans la mesure. Parce que si je vire le static des 2 fonctions et que je déplie un vieux gcc 3.4.4 cygming tout moisis,
|
Autrement dit, strictement la même chose.
Marsh Posté le 04-01-2007 à 15:03:34
deleted
Message édité par MagicBuzz le 01-02-2010 à 13:41:28