Se connecter
Se connecter
Inscription
Mot de passe perdu
Connexion:
[Actualités]
Windows 11 : le menu Démarrer ne fonctionne parfois plus après la mise à jour
[Actualités]
Test Legacy of Kain Soul Reaver 1&2 Remastered (PS5) - Raziel de retour
[Actualités]
2025 nous apportera le nouvel iPad abordable : nouveaux détails de lancement
[Actualités]
Découvrons quand le Père Noël arrivera pour livrer nos cadeaux, avec Santa Tr...
[Actualités]
Nintendo Switch 2, la date d'annonce et le mois de sortie ont-ils été révélÃ...
[Actualités]
WhatsApp nous permet désormais de réagir à un message en « tirant des confet...
[Actualités]
Les pliables ne décollent pas ? Samsung réduit ses plans de production
[Actualités]
PS5, Sony bannit-il les utilisateurs qui utilisent le navigateur "caché" de la ...
[Actualités]
Test The Thing Remastered (PS5) - Une refonte du classique de 2002
[Actualités]
L'iPhone le plus fin de tous les temps sera aussi le moins cher : ce que l'on sa...
[Articles]
Legacy of Kain Soul Reaver 1&2 Remastered
[Articles]
The Thing Remastered
[Articles]
Mario & Luigi : L'épopée fraternelle
[Articles]
Deel acquiert la plateforme mondiale de gestion de la rémunération Assemble
[Articles]
Xuan Yuan Sword: The Gate of Firmament
[Articles]
Cyber-sécurité : bilan 2024 et regard vers 2025 par Andy Garth, directeur Aff...
[Articles]
Diesel Legacy: The Brazen Age
[Articles]
FANTASIAN Neo Dimension
[Articles]
Fairy Tail 2
[Articles]
Réseaux sociaux inondés d'arnaques deepfake ; Formbook, voleur d'informations ...
Actualités
Lettre d'information
Proposer une actualité
Archives
Actualités
Articles
Programmation
Press Release
Matériel
Logiciels
Livres
Interviews
Derniers commentaires
Jeux Vidéos
XBox One
XBox 360
Wii U
PSP
PS4
PS3
PC
DS
GameCube
3DS
Forum
Derniers messages
Informatique
Fun
Divers
Logithèque
Blogs
Divers
A Propos
Annonceurs
Contact
Recherche
RSS
Editer un article
Titre
Mots Clés
Texte
[size=18] [b]Nom[/b] [/size] bc - Un langage de calculatrice à précision arbitraire [size=18] [b]Syntaxe[/b] [/size] [b]bc[/b] [ [b]-hilwsqv[/b] ] [options-longues] [ [i][/i] fichier ... ] [size=18] [b]Version[/b] [/size] Cette page de manuel documente GNU bc version 1.06. [size=18] [b]Description[/b] [/size] [b]bc[/b] est un langage qui supporte les nombres en précision arbitraire ainsi qu'une exécution interactive des instructions. Il y a quelques similitudes au niveau de la syntaxe avec le langage de programmation C. Une bibliothèque mathématique standard est disponible via les options de ligne de commandes. Si nécessaire, la bibliothèque mathématique peut être définie avant de prendre en compte le moindre fichier. [b]bc[/b] démarre en traitant le code de tous les fichiers listés sur la ligne de commandes dans leur ordre d'apparition. Après que tous les fichiers aient été traités, [b]bc[/b] lit à partir de l'entrée standard. Tout le code est exécuté dès qu'il est lu (si un fichier contient une commande indiquant d'arrêter le processeur, [b]bc[/b] ne lira jamais à partir de l'entrée standard). Cette version de [b]bc[/b] contient plusieurs extensions en sus des implémentations traditionnelles de [b]bc[/b] et du document de travail du standard POSIX. Les options de ligne de commandes peuvent faire afficher un avertissement par ces extensions, ou les rejeter. Ce document décrit le langage accepté par ce processeur. Les extensions seront identifiées en tant que telles. [b]Options[/b] "-h, --help" [table][row][col] [/col][col]Afficher un message d'utilisation et se terminer.[/col][/row][/table] "-i, --interactive" [table][row][col] [/col][col]Forcer le mode interactif.[/col][/row][/table] "-l, --mathlib" [table][row][col] [/col][col]Définir la bibliothèque mathématique standard.[/col][/row][/table] "-w, --warn" [table][row][col] [/col][col]Émettre des avertissements pour les extensions par rapport au [b]bc[/b] POSIX.[/col][/row][/table] "-s, --standard" [table][row][col] [/col][col]Traiter exactement le langage [b]bc[/b] POSIX.[/col][/row][/table] "-q, --quiet" [table][row][col] [/col][col]Ne pas afficher le message de bienvenue normal de GNU bc.[/col][/row][/table] "-v, --version" [table][row][col] [/col][col]Afficher le numéro de version et le copyright et se terminer. [/col][/row][/table] [b]Nombres[/b] L'élément le plus basique dans [b]bc[/b] est le nombre. Les nombres sont des nombres en précision arbitraire. Cette précision vaut à la fois pour la partie entière et pour la partie fractionnaire. Tous les nombres sont représentés de façon interne en décimal et tous les calculs sont effectués en décimal (cette version tronque les résultats des opérations de division et de multiplication). Les nombres ont ici deux attributs : la longueur et l'échelle. La longueur est le nombre total de chiffres décimaux significatifs d'un nombre et l'échelle est le nombre total de chiffres décimaux après le point décimal. [table][row][col] [/col][col]Par exemple, .nf[table][row][col] [/col][col] .000001 a une longueur de 6 et une échelle de 6. 1935.000 a une longueur de 7 et une échelle de 3.[/col][/row][/table] .fi [/col][/row][/table] [b]Variables[/b] Les nombres sont stockés dans deux types de variables : les variables simples et les variables tableaux. Toutes deux sont nommées. Les noms commencent par une lettre suivie d'un nombre quelconque de lettres, chiffres ou caractères de soulignement (« _ »). Toutes les lettres doivent être en minuscule. (Les noms entièrement alphanumériques forment une extension ; dans le [b]bc[/b] POSIX, tous les noms sont constitués d'une seule lettre minuscule.) Le type de variable est rendu évident grâce au contexte car tous les noms de variables tableaux sont suivis de crochets ([]). Il y a quatre variables spéciales : [b]scale , ibase , obase et last .[/b] [b]scale[/b] définit la façon dont certaines opérations utilisent les chiffres après le point décimal. La valeur par défaut pour [b]scale[/b] est 0. [b]ibase[/b] et [b]obase[/b] définissent la base de conversion pour les nombres en entrée et en sortie. La base par défaut est 10 que ce soit pour l'entrée ou pour la sortie. [b]last[/b] (une extension) est une variable ayant pour valeur le dernier nombre affiché. Ces variables spéciales seront commentées plus en détail quand le besoin s'en fera sentir. Toutes ces variables peuvent se voir affecter des valeurs, ainsi qu'être utilisées dans des expressions. [b]Commentaires[/b] Les commentaires dans [b]bc[/b] débutent par les caractères [b]/*[/b] et se terminent par les caractères [b]*/[/b]. Les commentaires peuvent démarrer n'importe où et apparaître comme une simple espace en entrée. (Cela conduit les commentaires à délimiter les autres éléments de l'entrée. Par exemple, un commentaire ne peut être trouvé au milieu d'un nom de variable.) Les commentaires incluent tous les sauts de ligne (fin de ligne) situés entre le début et la fin du commentaire. Pour que [b]bc[/b] supporte l'utilisation de scripts, un commentaire d'une seule ligne a été ajouté comme extension. Un commentaire d'une seule ligne débute par un caractère [b]#[/b] et continue jusqu'à la fin de la ligne. Le caractère de fin de ligne ne fait pas partie du commentaire et est traité normalement. [b]Expressions[/b] Les nombres sont manipulés par des expressions et des instructions. Puisque le langage a été conçu pour être interactif, les instructions et expressions sont exécutées le plus tôt possible. Il n'y a pas de programme « main » . Au lieu de cela, le code est exécuté dès qu'il est rencontré. (Les fonctions, discutées en détail par après, sont définies quand elles sont rencontrées.) Une expression simple est simplement une constante. [b]bc[/b] convertit les constantes en nombres décimaux en interne en utilisant la base d'entrée courante, spécifiée par la variable [b]ibase[/b]. (Il y a une exception dans les fonctions.) Les valeurs légales pour [b]ibase[/b] vont de 2 à 16. Affecter une valeur en dehors de cet intervalle à [b]ibase[/b] résultera en une valeur de 2 ou 16. Les nombres d'entrée peuvent contenir les caractères 0-9 et A-F. (Note : ils doivent être en majuscule ; les lettres minuscules sont des noms de variables.) Les nombres d'un seul chiffre ont toujours la valeur de ce chiffre quelle que soit la valeur de [b]ibase[/b]. (c.-à -d. A = 10.) Pour les nombres composés de plusieurs chiffres, [b]bc[/b] remplace tous les chiffres d'entrée supérieurs ou égaux à [b]ibase[/b] par la valeur de [b]ibase[/b]-1. Cela fait en sorte que le nombre [b]FFF[/b] est toujours le plus grand nombre de 3 chiffres dans la base d'entrée. Les expressions complètes sont similaires à celles de nombreux autres langages de haut niveau. Puisqu'il n'y a qu'un seul type de nombre, il n'y a pas de règles de mélange des types. Au lieu de cela, il existe des règles portant sur l'échelle des expressions. Chaque expression possède une échelle. Elle est dérivée de l'échelle des nombres originaux, de l'opération effectuée et, dans de nombreux cas, de la valeur de la variable [b]scale[/b]. Les valeurs légales pour la variable [b]scale[/b] vont de 0 au plus grand nombre représentable par un entier C. Dans les descriptions suivantes des expressions légales, « expr » se réfère à une expression complète, et « var » se réfère à une variable simple ou tableau. Une variable simple est juste un[table][row][col] [/col][col] [i]nom[/i][/col][/row][/table] et une variable tableau est spécifiée sous la forme[table][row][col] [/col][col] [i]nom[/i][[i]expr[/i]][/col][/row][/table] À moins qu'elle ne soit mentionnée spécifiquement, l'échelle du résultat est la plus grande de celle des expressions impliquées. "- expr" [table][row][col] [/col][col]Le résultat de la négation de l'expression.[/col][/row][/table] "++ var" [table][row][col] [/col][col]La variable est incrémentée de un et la nouvelle valeur est le résultat de l'expression.[/col][/row][/table] "-- var" [table][row][col] [/col][col]La variable est décrémentée de un et la nouvelle valeur est le résultat de l'expression.[/col][/row][/table] "var ++" [table][row][col] [/col][col]Le résultat de l'expression est la valeur de la variable, et ensuite la variable est incrémentée de un.[/col][/row][/table] "var --" [table][row][col] [/col][col]Le résultat de l'expression est la valeur de la variable, et ensuite la variable est décrémentée de un.[/col][/row][/table] "expr + expr" [table][row][col] [/col][col]Le résultat de l'expression est la somme des deux expressions.[/col][/row][/table] "expr - expr" [table][row][col] [/col][col]Le résultat de l'expression est la différence entre les deux expressions.[/col][/row][/table] "expr * expr" [table][row][col] [/col][col]Le résultat de l'expression est le produit des deux expressions.[/col][/row][/table] "expr / expr" [table][row][col] [/col][col]Le résultat de l'expression est le quotient des deux expressions. L'échelle du résultat est la valeur de la variable [b]scale[/b].[/col][/row][/table] "expr % expr" [table][row][col] [/col][col]Le résultat de l'expression est le « reste » et il est calculé de la manière suivante : pour calculer a%b, a/b est d'abord calculé avec une échelle de [b]scale[/b] chiffres. Ce résultat est utilisé pour calculer a-(a/b)*b à l'échelle du maximum entre [b]scale[/b]+scale(b) et scale(a). Si [b]scale[/b] vaut zéro et que les deux expressions sont entières, cette expression est la fonction de reste entier.[/col][/row][/table] "expr ^ expr" [table][row][col] [/col][col]Le résultat de l'expression est la valeur de la première expression exposant la seconde. La seconde expression doit être un entier. (Si la seconde expression n'est pas un entier, un avertissement est généré et l'expression est tronquée pour obtenir une valeur entière.) L'échelle du résultat est [b]scale[/b] si l'exposant est négatif. Si l'exposant est positif, l'échelle du résultat est le minimum entre l'échelle de la première expression fois la valeur de l'exposant, et le maximum entre [b]scale[/b] et l'échelle de la première expression (ou, mathématiquement parlant, scale(a^b) = min(scale(a)*b, max([b]scale,[/b] scale(a))) ). Il faut noter que expr^0 renverra toujours la valeur 1.[/col][/row][/table] "( expr )" [table][row][col] [/col][col]Ceci altère la priorité standard pour forcer l'évaluation de l'expression.[/col][/row][/table] "var = expr" [table][row][col] [/col][col]La valeur de l'expression est affectée à la variable.[/col][/row][/table] "var
= expr" [table][row][col] [/col][col]C'est équivalent à « var = var
expr » à l'exception que la partie « var » n'est évaluée qu'une seule fois. Cela peut faire une différence si « var » est un tableau.[/col][/row][/table] Les expressions relationnelles sont un cas particulier des expressions qui sont toujours évaluées à 0 ou 1 : 0 si la relation est fausse et 1 si la relation est vraie. Elles peuvent apparaître dans n'importe quelle expression légale. (Le [b]bc[/b] POSIX requiert que les expressions relationnelles ne peuvent être utilisées que dans les instructions if, for et while, et qu'un seul test relationnel peut y être effectué.) Les opérateurs relationnels sont "expr1 < expr2" [table][row][col] [/col][col]Le résultat est 1 si expr1 est strictement inférieure à expr2.[/col][/row][/table] "expr1 <= expr2" [table][row][col] [/col][col]Le résultat est 1 si expr1 est plus petite ou égale à expr2.[/col][/row][/table] "expr1 > expr2" [table][row][col] [/col][col]Le résultat est 1 si expr1 est strictement supérieure à expr2.[/col][/row][/table] "expr1 >= expr2" [table][row][col] [/col][col]Le résultat est 1 si expr1 est plus grande ou égale à expr2.[/col][/row][/table] "expr1 == expr2" [table][row][col] [/col][col]Le résultat est 1 si expr1 est égale à expr2.[/col][/row][/table] "expr1 != expr2" [table][row][col] [/col][col]Le résultat est 1 si expr1 n'est pas égale à expr2.[/col][/row][/table] Les opérateurs booléens sont également légaux. (Le [b]bc[/b] POSIX ne possède PAS les opérations booléennes). Le résultat de toutes les expressions booléennes est 0 ou 1 (pour faux ou vrai) comme dans les expressions relationnelles. Les opérateurs booléens sont : "!expr" [table][row][col] [/col][col]Le résultat est 1 si expr vaut 0.[/col][/row][/table] "expr && expr" [table][row][col] [/col][col]Le résultat est 1 si les deux expressions sont non nulles.[/col][/row][/table] "expr || expr" [table][row][col] [/col][col]Le résultat est 1 si (au moins) l'une des deux expressions est non nulle.[/col][/row][/table] La priorité dans les expressions est la suivante (de la plus basse à la plus haute) : .nf[table][row][col] [/col][col] opérateur ||, associatif à gauche opérateur &&, associatif à gauche opérateur !, non associatif opérateurs relationnels, associatifs à gauche opérateur d'affectation, associatif à droite opérateurs + et - , associatifs à gauche opérateurs *, / et %, associatifs à gauche opérateur ^, associatif à droite opérateur - unaire, non associatif opérateurs ++ et -- , non associatifs[/col][/row][/table] .fi Cette priorité a été choisie de telle sorte que les programmes [b]bc[/b] conformes à POSIX s'exécutent correctement. Cela conduira à ce que l'utilisation des opérateurs relationnels et logiques mène à un comportement inhabituel lors de leur utilisation dans des expressions d'affectation. Considérez l'expression [table][row][col] [/col][col] a = 3 < 5[/col][/row][/table] La plupart des programmeurs C supposeraient que cela affecte le résultat de « 3 < 5 » (la valeur 1) à la variable « a ». Ce que cela fait dans [b]bc[/b] est d'affecter la valeur 3 à la variable « a » et de comparer ensuite 3 à 5. Il vaut mieux utiliser des parenthèses lors de l'utilisation d'opérateurs relationnels ou logiques en présence d'opérateurs d'affectation. Il y a quelques expressions spéciales supplémentaires qui sont fournies dans [b]bc[/b]. Elles se rapportent à des fonctions définies par l'utilisateur et à des fonctions standard. Elles apparaissent toutes sous la forme « [i]nom[/i][b]([/b][i]paramètres[/i][b])[/b] ». Voyez la section sur les fonctions pour en savoir plus sur les fonctions définies par l'utilisateur. Les fonctions standard sont : "length ( expression )" [table][row][col] [/col][col]La valeur de la fonction length est le nombre de chiffres significatifs de l'expression.[/col][/row][/table] "read ( )" [table][row][col] [/col][col]La fonction read (une extension) lit un nombre à partir de l'entrée standard, où qu'elle soit appelée. Attention : cela peut causer des problèmes lors du mélange de données et d'un programme sur l'entrée standard. Le meilleur usage de cette fonction se situe dans un programme précédemment écrit qui a besoin d'entrée en provenance de l'utilisateur, mais qui ne permet jamais que l'utilisateur entre du code. La valeur de la fonction read est le nombre lu à partir de l'entrée standard en utilisant la valeur actuelle de la variable [b]ibase[/b] comme base de conversion.[/col][/row][/table] "scale ( expression )" [table][row][col] [/col][col]La valeur de la fonction scale est le nombre de chiffres après la virgule dans l'expression.[/col][/row][/table] "sqrt ( expression )" [table][row][col] [/col][col]La valeur de la fonction sqrt est la racine carrée de l'expression. Si l'expression est négative, une erreur à l'exécution est générée. [/col][/row][/table] [b]Instructions[/b] Les instructions (comme dans la plupart des langages algébriques) fournissent le séquencement de l'évaluation d'une expression. Dans [b]bc[/b], les instructions sont exécutées « le plus tôt possible ». L'exécution se produit quand un saut de ligne est rencontré, et qu'il y a une ou plusieurs instructions complètes. À cause de cette exécution immédiate, les sauts de ligne sont très importants dans [b]bc[/b]. En fait, à la fois le point-virgule et le saut de ligne sont utilisés comme séparateurs d'instructions. Un saut de ligne mal placé provoquera une erreur de syntaxe. Puisque les sauts de ligne sont des séparateurs d'instructions, il est possible de cacher un saut de ligne en utilisant le caractère backslash. La séquence « e
», où
est le saut de ligne, apparaît aux yeux de [b]bc[/b] comme une espace blanche au lieu d'un saut de ligne. Une liste d'instructions est une série d'instructions séparées par des points-virgules et des sauts de ligne. Voici une liste des instructions [b]bc[/b] et ce qu'elles font : (les éléments enfermés entre crochets ([]) sont des parties optionnelles de l'instruction.) "expression" [table][row][col] [/col][col]Cette instruction accomplit une ou deux actions. Si l'expression débute par «
... », elle est considérée être une instruction d'affectation. Si l'expression n'est pas une instruction d'affectation, l'expression est évaluée et imprimée sur la sortie. Après que le nombre ait été affiché, un saut de ligne l'est également. Par exemple, « a=1 » est une instruction d'affectation et « (a=1) » est une expression qui possède une affectation imbriquée. Tous les nombres qui sont affichés le sont dans la base spécifiée par la variable [b]obase[/b]. Les valeurs légales pour [b]obase[/b] vont de 2 à BC_BASE_MAX. (Voyez la section LIMITES.) Pour les bases 2 à 16, la méthode habituelle d'écriture des nombres est utilisée. Pour les bases supérieures à 16, [b]bc[/b] utilise une méthode utilisant des chiffres multi-caractères pour afficher les nombres, où chaque chiffre d'une base supérieure est affiché comme un nombre en base 10. Les chiffres multi-caractères sont séparés par des espaces. Chaque chiffre contient le nombre de caractères requis pour représenter la valeur en base dix de « obase-1 ». Puisque les nombres sont en précision arbitraire, certains nombres ne peuvent être affichés sur une seule ligne de sortie. Ces nombres longs seront éclatés sur plusieurs lignes en utilisant « e » comme dernier caractère sur une ligne. Le nombre maximal de caractères affichés par ligne est 70. À cause de la nature interactive de [b]bc[/b], l'affichage d'un nombre présente comme effet de bord l'affectation de la valeur affichée à la variable spéciale [b]last[/b]. Cela permet à l'utilisateur de récupérer la dernière valeur affichée sans avoir à retaper l'expression qui a affiché le nombre. Affecter vers [b]last[/b] est légal et écrasera la dernière valeur affichée par la valeur affectée. La valeur nouvellement affectée restera jusqu'à ce que le nombre suivant soit affiché ou qu'une autre valeur soit affectée à [b]last[/b]. (Certaines installations peuvent permettre l'utilisation d'un simple point (.) qui ne fait pas partie d'un nombre comme un raccourci pour [b]last[/b].)[/col][/row][/table] "chaîne" [table][row][col] [/col][col]La chaîne de caractères est imprimée sur la sortie. Les chaînes débutent par un guillemet (") et contiennent tous les caractères présents jusqu'au guillemet suivant. Tous les caractères sont utilisés littéralement, y compris les sauts de ligne. Aucun caractère de saut de ligne n'est imprimé après la chaîne.[/col][/row][/table] "[b]print[/b] liste" [table][row][col] [/col][col]L'instruction print (une extension) fournit une autre méthode de sortie. La « liste » est une liste de chaînes et d'expressions séparées par des virgules. Les chaînes ou expressions sont affichées dans leur ordre d'apparition dans cette liste. Aucun saut de ligne terminal n'est affiché. Les expressions sont évaluées et leur valeur est affichée et affectée à la variable [b]last[/b]. Les chaînes de l'instruction print sont imprimées sur la sortie et peuvent contenir des caractères spéciaux. Les caractères spéciaux débutent par le caractère backslash (e). Les caractères spéciaux reconnus par [b]bc[/b] sont « a » (alerte ou sonnerie), « b » (effacement arrière), « f » (saut de page), « n » (saut de ligne), « r » (retour chariot), « q » (guillemet), « t » (tabulation) et « e » (backslash). Tout autre caractère suivant le backslash sera ignoré.[/col][/row][/table] "{ liste_instructions }" [table][row][col] [/col][col]C'est l'instruction composée. Elle permet à plusieurs instructions d'être regroupées pour exécution.[/col][/row][/table] "[b]if[/b] ( expression ) instruction1 [[b]else[/b] instruction2]" [table][row][col] [/col][col]L'instruction if évalue l'expression et exécute instruction1 ou instruction2 en fonction de la valeur de l'expression. Si l'expression est non nulle, instruction1 est exécutée. Si instruction2 est présente et que la valeur de l'expression est 0, alors instruction2 est exécutée. (La clause else est une extension.)[/col][/row][/table] "[b]while[/b] ( expression ) instruction" [table][row][col] [/col][col]L'instruction while exécutera l'instruction tant que l'expression est non nulle. Elle évalue l'expression avant chaque exécution de l'instruction. La fin de la boucle est causée par une valeur d'expression de 0, ou par l'exécution d'une instruction break.[/col][/row][/table] "[b]for[/b] ( [expression1] ; [expression2] ; [expression3] ) instruction" [table][row][col] [/col][col]L'instruction for contrôle l'exécution répétée de l'instruction. Expression1 est évaluée avant la boucle. Expression2 est évaluée avant chaque exécution de l'instruction. Si elle est non nulle, l'instruction est évaluée. Si elle est nulle, la boucle est terminée. Après chaque exécution de l'instruction, expression3 est évaluée avant la réévaluation de expression2. Si expression1 ou expression3 manque, rien n'est évalué au moment où elle devrait l'être. Si expression2 manque, cela revient à substituer la valeur 1 à expression2. (Les expressions optionnelles sont une extension. Le [b]bc[/b] POSIX requiert les trois expressions.) Le code suivant est équivalent à l'instruction for :[/col][/row][/table] .nf[table][row][col] [/col][col] expression1; while (expression2) { instruction; expression3; }[/col][/row][/table] .fi "[b]break[/b]" [table][row][col] [/col][col]Cette instruction provoque un arrêt forcé de l'instruction while ou for englobante la plus proche.[/col][/row][/table] "[b]continue[/b]" [table][row][col] [/col][col]L'instruction continue (une extension) force l'instruction for englobante la plus proche à commencer l'itération suivante.[/col][/row][/table] "[b]halt[/b]" [table][row][col] [/col][col]L'instruction halt (une extension) est une instruction exécutée qui indique au processeur [b]bc[/b] de ne s'arrêter que lorsqu'elle est exécutée. Par exemple, « if (0 == 1) halt » n'obligera pas [b]bc[/b] à se terminer car le halt n'est pas exécuté.[/col][/row][/table] "[b]return[/b]" [table][row][col] [/col][col]Renvoyer la valeur 0 à partir d'une fonction. (Voyez la section sur les fonctions.)[/col][/row][/table] "[b]return[/b] ( expression )" [table][row][col] [/col][col]Renvoyer la valeur de l'expression à partir d'une fonction. (Voyez la section sur les fonctions.) Comme extension, les parenthèses ne sont pas requises. [/col][/row][/table] [b]Pseudo-instructions[/b] Ces instructions ne sont pas des instructions au sens traditionnel du terme. Elles ne sont pas des instructions exécutées. Leur fonction est effectuée au moment de la compilation. "[b]limits[/b]" [table][row][col] [/col][col]Afficher les limites locales astreintes par la version locale de [b]bc[/b]. C'est une extension.[/col][/row][/table] "[b]quit[/b]" [table][row][col] [/col][col]Quand l'instruction quit est lue, le processeur [b]bc[/b] est arrêté, quel que soit l'emplacement de l'instruction quit. Par exemple, « if (0 == 1) quit » provoquera l'arrêt de [b]bc[/b].[/col][/row][/table] "[b]warranty[/b]" [table][row][col] [/col][col]Afficher une notice de garantie plus longue. C'est une extension. [/col][/row][/table] [b]Fonctions[/b] Les fonctions fournissent une méthode pour définir un calcul qui peut être exécuté ultérieurement. Les fonctions de [b]bc[/b] calculent toujours une valeur et la renvoient à l'appelant. Les définitions de fonctions sont « dynamiques » dans le sens où une fonction n'est pas définie avant que sa définition ait été rencontrée en entrée. Cette définition est ensuite utilisée jusqu'à ce qu'une définition de fonction de même nom soit rencontrée. La nouvelle définition remplace ensuite l'ancienne. Une fonction est définie comme suit : .nf[table][row][col] [/col][col] [b]define[/b] [i]nom[/i] [b]([/b] [i]paramètres[/i] [b])[/b] { [i]saut_de_ligne[/i] [i][/i] liste_auto liste_instructions [b]}[/b][/col][/row][/table] .fi Un appel de fonction est simplement une expression de la forme « [i]nom[/i][b]([/b][i]paramètres[/i][b])[/b] ». Les paramètres sont des nombres ou des tableaux (une extension). Dans la définition de fonction, zéro paramètres ou plus sont définis en fournissant leurs noms séparés par des virgules. Les nombres sont des paramètres passés uniquement par valeur. Les tableaux sont passés uniquement par variable (référence). Les tableaux sont spécifiés dans la définition des paramètres par la notation « [i]nom[/i][b][][/b] ». Dans l'appel de fonction, les paramètres réels sont des expressions complètes pour les paramètres nombres. La même notation est utilisée pour passer des tableaux et pour définir des paramètres tableaux. Le tableau nommé est passé par variable à la fonction. Puisque les définitions de fonctions sont dynamiques, le nombre de paramètres et leur type sont vérifiés quand une fonction est appelée. Toute erreur dans le nombre ou le type des paramètres provoquera une erreur à l'exécution. Une erreur à l'exécution se produit également lors de l'appel d'une fonction non définie. La [i]liste_auto[/i] est une liste optionnelle de variables destinées à une utilisation « locale ». La syntaxe de la liste_auto (si elle est présente) est « [b]auto[/b] [i]nom[/i], ... ; ». (Le point-virgule est optionnel.) Chaque [i]nom[/i] est le nom d'une variable automatique. Les tableaux peuvent être spécifiés en utilisant la même notation que celle utilisée pour les paramètres. Ces variables voient leur valeur empilée au début de la fonction. Les variables sont ensuite initialisées à zéro et utilisées tout au long de l'exécution de la fonction. À la sortie de la fonction, ces valeurs sont dépilées afin que leur valeur originale (au moment de l'appel de la fonction) soit restaurée. Les paramètres sont réellement des variables automatiques qui sont initialisées à une valeur fournie dans l'appel de fonction. Les variables automatiques sont différentes des variables locales traditionnelles car, si une fonction A appelle une fonction B, B peut accéder aux variables automatiques de A en utilisant simplement le même nom, à moins que la fonction B en ait fait des variables automatiques. Étant donné que les variables automatiques et les paramètres sont placés sur une pile, [b]bc[/b] supporte les fonctions récursives. Le corps de la fonction est une liste d'instructions [b]bc[/b]. À nouveau, les instructions sont séparées par des points-virgules ou des sauts de ligne. Les instructions return provoquent l'arrêt de la fonction et le renvoi d'une valeur. Il y a deux versions de l'instruction return. La première forme, « [b]return[/b] », renvoie la valeur 0 à l'expression appelante. La seconde forme, « [b]return[/b] ([i]expression[/i] [b])[/b] », calcule la valeur de l'expression et la renvoie à l'expression appelante. Il y a un « [b]return[/b] (0) » implicite à la fin de chaque fonction. Cela permet à une fonction de se terminer et de renvoyer 0 sans avoir besoin d'une instruction return explicite. Les fonctions modifient également l'utilisation de la variable [b]ibase[/b]. Toutes les constantes dans le corps de la fonction seront converties en utilisant la valeur de [b]ibase[/b] au moment de l'appel de fonction. Les changements d'[b]ibase[/b] seront ignorés durant l'exécution de la fonction sauf pour la fonction standard [b]read[/b], qui utilise toujours la valeur actuelle de [b]ibase[/b] pour les conversions de nombres. Comme extension, le format de la définition a été rendu légèrement moins astreignant. Le standard requiert que l'accolade d'ouverture doit être placée sur la même ligne que le mot-clé [b]define[/b] et que toutes les autres parties doivent se situer sur les lignes suivantes. Cette version de [b]bc[/b] permettra un nombre quelconque de sauts de ligne avant et après l'accolade d'ouverture de la fonction. Par exemple, les définitions suivantes sont légales : .nf[table][row][col] [/col][col] f(CW define d (n) { return (2*n); } define d (n) { return (2*n); } [/col][/row][/table] .fi [b]BibliothÈque mathÉmatique[/b] Si [b]bc[/b] est invoqué avec l'option [b]-l[/b], une bibliothèque mathématique est préchargée et l'échelle par défaut est fixée à 20. Les fonctions mathématiques calculeront leur résultat à l'échelle établie au moment de leur appel. La bibliothèque mathématique définit les fonctions suivantes : "s ([i]x[/i])" [table][row][col] [/col][col]Le sinus de x ; x est exprimé en radians.[/col][/row][/table] "c ([i]x[/i])" [table][row][col] [/col][col]Le cosinus de x ; x est exprimé en radians.[/col][/row][/table] "a ([i]x[/i])" [table][row][col] [/col][col]L'arctangente de x ; l'arctangente renvoie des radians.[/col][/row][/table] "l ([i]x[/i])" [table][row][col] [/col][col]Le logarithme naturel (népérien) de x.[/col][/row][/table] "e ([i]x[/i])" [table][row][col] [/col][col]La fonction d'exponentiation de e à la puissance x.[/col][/row][/table] "j ([i]n,x[/i])" [table][row][col] [/col][col]La fonction de Bessel d'ordre entier n de x. [/col][/row][/table] [b]Exemples[/b] Dans /bin/sh, le code suivant affectera la valeur de « pi » à la variable shell [b]pi[/b].[table][row][col] [/col][col] f(CW pi=$(echo "scale=10; 4*a(1)" | bc -l) [/col][/row][/table] Le code suivant est la définition de la fonction exponentielle utilisée dans la bibliothèque mathématique. Cette fonction est écrite en [b]bc[/b] POSIX. .nf[table][row][col] [/col][col] f(CW scale = 20 /* Utilise le fait que e^x = (e^(x/2))^2 Quand x est suffisamment petit, nous utilisons le développement en série : e^x = 1 + x + x^2/2! + x^3/3! + ... */ define e(x) { auto a, d, e, f, i, m, v, z /* Vérifier le signe de x. */ if (x<0) { m = 1 x = -x } /* Précondition x. */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2; } /* Initialiser les variables. */ v = 1+x a = x d = 1 for (i=2; 1; i++) { e = (a *= x) / (d *= i) if (e == 0) { if (f>0) while (f--) v = v*v; scale = z if (m) return (1/v); return (v/1); } v += e } } [/col][/row][/table] .fi Le code suivant utilise les fonctionnalités avancées de [b]bc[/b] pour implémenter un programme simple de calcul des soldes de chéquiers. Ce programme est conservé de préférence dans un fichier pour qu'il puisse être réutilisé à maintes reprises sans avoir à le retaper à chaque fois. .nf[table][row][col] [/col][col] f(CW scale=2 print "enProgramme Chéquier !en" print " Rappelez-vous, les dépôts sont des transactions négatives.en" print " Quittez par une transaction 0.enen" print "Solde initial ? "; bal = read() bal /= 1 print "en" while (1) { "Solde actuel = "; bal "transaction ? "; trans = read() if (trans == 0) break; bal -= trans bal /= 1 } quit [/col][/row][/table] .fi Le code suivant est la définition de la fonction factorielle récursive : .nf[table][row][col] [/col][col] f(CW define f (x) { if (x <= 1) return (1); return (f(x-1) * x); } [/col][/row][/table] .fi [b]Options readline et libedit[/b] GNU [b]bc[/b] peut être compilé (via une option de configuration) pour utiliser soit la bibliothèque d'éditeur d'entrée GNU [b]readline[/b], soit la bibliothèque BSD [b]libedit[/b]. Cela permet à l'utilisateur d'éditer des lignes avant de les envoyer à [b]bc[/b]. Cela permet également un historique des lignes précédemment tapées. Quand cette option est sélectionnée, [b]bc[/b] possède une variable spéciale supplémentaire. Cette variable spéciale, [b]history[/b], est le nombre de lignes d'historique mémorisées. Pour [b]readline[/b], une valeur de -1 signifie qu'un nombre illimité de lignes d'historique sont mémorisées. Fixer la valeur de [b]history[/b] à un nombre positif restreint le nombre de lignes d'historique au nombre fourni. La valeur 0 désactive cette fonctionnalité d'historique. La valeur par défaut est 100. Pour plus d'informations, lisez les manuels d'utilisateur des bibliothèques GNU [b]readline[/b] et [b]history[/b], et BSD [b]libedit[/b]. On ne peut pas activer à la fois [b]readline[/b] et [b]libedit[/b] au même moment. [b]DiffÉrences[/b] Cette version de [b]bc[/b] a été implémentée sur base du document de travail POSIX P1003.2/D11 et contient plusieurs différences et extensions par rapport au document de travail et aux implémentations traditionnelles. Il n'a pas été implémenté de la façon traditionnelle en utilisant [i]dc(1).[/i] Cette version est un unique processus qui analyse et exécute une traduction en code octet (byte code) du programme. Il y a une option « non documentée » (-c) qui fait émettre par le programme le code octet sur la sortie standard au lieu de l'exécuter. Elle a été principalement utilisée pour déboguer l'analyseur syntaxique et pour préparer la bibliothèque mathématique. Une source majeure de différences est constituée par les extensions, où une fonctionnalité est étendue pour offrir plus de possibilités, ou encore où de nouvelles fonctionnalités sont ajoutées. Voici la liste des différences et extensions : LANG [table][row][col] [/col][col]Cette version ne se conforme pas au standard POSIX en ce qui concerne le traitement de la variable d'environnement LANG et de toutes les variables d'environnement dont le nom débute par LC_.[/col][/row][/table] noms [table][row][col] [/col][col]Les [b]bc[/b] traditionnel et POSIX n'ont des noms composés que d'une seule lettre pour les fonctions, variables et tableaux. Ils ont été étendus pour supporter les noms de plusieurs caractères débutant par une lettre et pouvant contenir des lettres, des nombres, et le caractère de soulignement (_).[/col][/row][/table] Chaînes [table][row][col] [/col][col]Les chaînes de caractères ne peuvent pas contenir de caractère NUL. POSIX dit que tous les caractères peuvent être inclus dans les chaînes de caractères.[/col][/row][/table] last [table][row][col] [/col][col]Le [b]bc[/b] POSIX ne possède pas de variable [b]last[/b]. Certaines implémentations de [b]bc[/b] utilisent le point (.) d'une manière similaire. [/col][/row][/table] comparaisons [table][row][col] [/col][col]Le [b]bc[/b] POSIX ne permet les comparaisons que dans l'instruction if, l'instruction while, et la seconde expression de l'instruction for. De plus, une seule opération relationnelle est permise dans chacune de ces instructions.[/col][/row][/table] "instruction if, clause else" [table][row][col] [/col][col]Le [b]bc[/b] POSIX ne possède pas de clause else.[/col][/row][/table] "instruction for" [table][row][col] [/col][col]Le [b]bc[/b] POSIX requiert que toutes les expressions soient présentes dans l'instruction for.[/col][/row][/table] "&&, ||, !" [table][row][col] [/col][col]Le [b]bc[/b] POSIX ne dispose pas des opérateurs logiques.[/col][/row][/table] "fonction read" [table][row][col] [/col][col]Le [b]bc[/b] POSIX ne possède pas de fonction read.[/col][/row][/table] "instruction print" [table][row][col] [/col][col]Le [b]bc[/b] POSIX ne possède pas d'instruction print.[/col][/row][/table] "instruction continue" [table][row][col] [/col][col]Le [b]bc[/b] POSIX ne possède pas d'instruction continue.[/col][/row][/table] "instruction return" [table][row][col] [/col][col]Le [b]bc[/b] POSIX requiert des parenthèses autour de l'expression de return.[/col][/row][/table] "paramètres tableaux" [table][row][col] [/col][col]Le [b]bc[/b] POSIX ne supporte (actuellement) pas totalement les paramètres tableaux. La grammaire POSIX autorise les tableaux dans les définitions de fonctions, mais ne fournit pas de méthode pour spécifier un tableau comme paramètre réel. (C'est plus que probablement un oubli dans la grammaire.) Les implémentations traditionnelles de [b]bc[/b] ne supportent que les paramètres tableaux passés par valeur.[/col][/row][/table] "format de fonction" [table][row][col] [/col][col]Le [b]bc[/b] POSIX requiert que l'accolade ouvrante soit sur la même ligne que le mot-clé [b]define[/b] et que l'instruction [b]auto[/b] soit sur la ligne suivante.[/col][/row][/table] "=+, =-, =*, =/, =%, =^" [table][row][col] [/col][col]Le [b]bc[/b] POSIX ne requiert pas la définition de ces opérateurs d'affectation dans l'« ancien style ». Cette version peut permettre ces affectations dans l'« ancien style ». Utilisez l'instruction limits pour voir si la version installée les supporte. Si elle supporte les opérateurs d'affectation dans l'« ancien style », l'instruction « a =- 1 » décrémentera [b]a[/b] de 1 au lieu de fixer [b]a[/b] à la valeur -1.[/col][/row][/table] "espaces dans les nombres" [table][row][col] [/col][col]D'autres implémentations de [b]bc[/b] permettent les espaces dans les nombres. Par exemple, « x=1 3 » affecterait la valeur 13 à la variable x. La même instruction causerait une erreur de syntaxe dans cette version de [b]bc[/b].[/col][/row][/table] "erreurs et exécution" [table][row][col] [/col][col]Cette implémentation se différencie des autres implémentations par le code qui est exécuté quand des erreurs de syntaxe ou d'autres erreurs sont détectées dans le programme. Si une erreur de syntaxe est trouvée dans une définition de fonction, la récupération des erreurs essaie de trouver le début d'une instruction et continue à analyser la fonction. Une fois qu'une erreur de syntaxe est trouvée dans la fonction, la fonction ne sera pas appelable et devient non définie. Les erreurs de syntaxe dans le code d'exécution interactif invalideront le bloc d'exécution courant. Le bloc d'exécution est terminé par une fin de ligne qui apparaît après une séquence complète d'instructions. Par exemple, a = 1 b = 2 possède deux blocs d'exécution et { a = 1 b = 2 } en possède un. Toute erreur à l'exécution terminera l'exécution du bloc d'exécution courant. Un avertissement à l'exécution ne terminera pas l'exécution du bloc d'exécution courant.[/col][/row][/table] "Interruptions" [table][row][col] [/col][col]Durant une session interactive, le signal SIGINT (habituellement généré par le caractère control-C sur le terminal) interrompra l'exécution du bloc d'exécution courant. Il provoquera l'affichage d'une erreur à l'exécution indiquant quelle fonction a été interrompue. Après que toutes les structures à l'exécution aient été « nettoyées », un message sera affiché pour notifier l'utilisateur que [b]bc[/b] est prêt à recevoir de l'entrée supplémentaire. Toutes les fonctions précédemment définies le restent, et la valeur de toutes les variables non automatiques est celle ayant cours au moment de l'interruption. Toutes les variables automatiques et paramètres de fonction sont supprimés durant le processus de nettoyage. Durant une session non interactive, le signal SIGINT terminera l'exécution entière de [b]bc[/b]. [/col][/row][/table] [b]Limites[/b] Voici les limites actuellement en vigueur pour ce processeur [b]bc.[/b] Certaines d'entre elles peuvent avoir été modifiées par une installation. Utilisez l'instruction limits pour voir les valeurs réelles. BC_BASE_MAX [table][row][col] [/col][col]La base de sortie maximale est actuellement fixée à 999. La base d'entrée maximale est 16.[/col][/row][/table] BC_DIM_MAX [table][row][col] [/col][col]C'est actuellement une limite arbitraire de 65535 dans la distribution. Votre installation peut être différente.[/col][/row][/table] BC_SCALE_MAX [table][row][col] [/col][col]Le nombre de chiffres après la virgule est limité à INT_MAX chiffres. Le nombre de chiffres avant la virgule est également limité à INT_MAX chiffres.[/col][/row][/table] BC_STRING_MAX [table][row][col] [/col][col]La limite sur le nombre de caractères dans une chaîne est de INT_MAX caractères.[/col][/row][/table] exposant [table][row][col] [/col][col]La valeur de l'exposant dans l'opération d'exponentiation (^) est limitée à LONG_MAX.[/col][/row][/table] "noms de variable" [table][row][col] [/col][col]Le nombre maximal de noms uniques est fixé à 32767 pour toutes les variables simples, les tableaux et les fonctions.[/col][/row][/table] [size=18] [b]Variables denvironnement[/b] [/size] Les variables d'environnement suivantes sont traitées par [b]bc[/b] : "POSIXLY_CORRECT" [table][row][col] [/col][col]Comme l'option [b]-s[/b].[/col][/row][/table] "BC_ENV_ARGS" [table][row][col] [/col][col]C'est un autre mécanisme pour obtenir des arguments pour [b]bc[/b]. Le format est le même que celui des arguments en ligne de commandes. Ces arguments sont traités en premier lieu, de sorte que les fichiers listés dans les arguments d'environnement sont traités avant n'importe quel fichier apparaissant comme argument sur la ligne de commandes. Cela permet à l'utilisateur de définir des options et des fichiers « standard » à traiter lors de chaque invocation de [b]bc[/b]. Les fichiers présents dans les variables d'environnement contiennent typiquement des définitions de fonctions pour les fonctions que l'utilisateur veut voir définies à chaque fois que [b]bc[/b] est exécuté.[/col][/row][/table] "BC_LINE_LENGTH" [table][row][col] [/col][col]Cela devrait être un entier spécifiant le nombre de caractères dans une ligne de sortie pour les nombres. Cela inclut les caractères backslash et de saut de ligne pour les nombres longs. [/col][/row][/table] [size=18] [b]Diagnostiques[/b] [/size] Si l'un des fichiers de la ligne de commandes ne peut être ouvert, [b]bc[/b] indiquera que le fichier n'est pas disponible et se terminera. Il y a également des diagnostics lors de la compilation et de l'exécution qui devraient être suffisamment explicites. [size=18] [b]Bugs[/b] [/size] La récupération après erreur n'est pas encore très bonne. Envoyez vos rapports de bogues par email à [b]bug-bc@gnu.org .[/b] Assurez-vous d'inclure le mot « bc » quelque part dans le champ « Sujet : ». [size=18] [b]Auteur[/b] [/size] .nf Philip A. Nelson philnelson@acm.org .fi [size=18] [b]Remerciements[/b] [/size] L'auteur voudrait remercier Steve Sommars (Steve.Sommars@att.com) pour son aide intensive lors des tests de l'implémentation. Il a fourni beaucoup de suggestions géniales. C'est un produit bien meilleur grâce à son implication. [size=18] [b]Traduction[/b] [/size] Frédéric Delanoy <[i]delanoy_f[/i] at yahoo.com>, 2001.
Fichier
Forum
-
Derniers messages
Bavardages
Aujourd'hui, je rénove ou je construis ^^
Software
problème sur windows 10
Réseaux et Télécom
Administrateur Réseau - Cisco
Réseaux et Télécom
Problème wifi (POE)
Software
Postfix - Need help
Bavardages
Oh râge oh désespoir !
Programmation
Enregistrement client et envoi mail
Software
SÉCURITÉ MACBOOK
Hardware
conseil matos réseau?
Hardware
nVidia Shield Android TV
Actualités
-
Archives
Windows
Windows 11 : le menu Démarrer ne fonctionne parfois plus après la mise à jour
Jeux Vidéos
Test Legacy of Kain Soul Reaver 1&2 Remastered (PS5) - Raziel de retour
Tablettes
2025 nous apportera le nouvel iPad abordable : nouveaux détails de lancement
Google
Découvrons quand le Père Noël arrivera pour livrer nos cadeaux, avec Santa Tracker de Google
Consoles
Nintendo Switch 2, la date d'annonce et le mois de sortie ont-ils été révélés par un leaker ?
Ada
CSS
Cobol
CPP
HTML
Fortran
Java
JavaScript
Pascal
Perl
PHP
Python
SQL
VB
XML
Anon URL
DailyMotion
eBay
Flickr
FLV
Google Video
Google Maps
Metacafe
MP3
SeeqPod
Veoh
Yahoo Video
YouTube
6px
8px
10px
12px
14px
16px
18px
Informaticien.be
- © 2002-2024
Akretio
SPRL - Generated via
Kelare
The Akretio Network:
Akretio
-
Freedelity
-
KelCommerce
-
Votre publicité sur informaticien.be ?