Section courante

A propos

Section administrative du site

 Langage  Installation  Elément  Tutoriel  Programmation  Bibliothèque  Cadre d'application  GUI  Projet  Jeux  Outils  Emulateur  Annexe  Aide 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Turbo Pascal 5
Turbo Pascal 5.5
Turbo Pascal 6
Turbo Pascal 7
Introduction
Les remarques
Les opérateurs
Les instructions conditionnelles
Les instructions de boucles
Type de données
Référence des unités
Références de mots réservés (mots clefs)
Définition de procédure et fonction
Référence de procédures et fonctions
Référence des directives de compilation
CRT
DOS
GRAPH
OBJECTS
OVERLAY
PRINTER
STRINGS
SYSTEM
TURBO3
WINDOS
Catégorie
Prototype
ASCIZ
Date
Ensemble
Fichier
Mémoire
Temps
Trigonométrie
Les premiers pas
Les jetons
Les constantes
Les types
Variables et constantes typées
Les expressions
Les instructions
Blocs, localité et étendue
Procédures et fonctions
Programmes et unités
Vue d'ensemble de la bibliothèque d'exécution
Procédures et fonctions standard
Entrée et sortie
Utilisation du 80x87
Interfaçage avec DOS
Utilisation de chaînes de caractères terminées par NULL
Utilisation de l'interface graphique Borland
Utilisation de recouvrement
Problèmes de mémoire
Problèmes de contrôle
Optimiser votre code
L'assembleur intégré
Liaison de code assembleur
Programmation orientée objet (POO)
Les fichiers
Les périphériques logiques
Files d'attente, piles, listes liées et arborescences
Bonjour
Affichage
Astronomie
Biochimie
Chimie
Conversion
Électrotechnique
Emulateur
Fichiers
Finance
Géographie
Géophysique
Géométrie
Histoire
Jeux & stratégies
Mathématique
Matrice
Médicale
Météorologie
Océanographie
Onirologie
Sport
Temps
Tri
Trigonométrie
Validation
«DRAW» du BASIC
Phase lunaire
Calcul du calcium corrigé
Calcul le taux d'alcoolémie
Bin,Hex,Base62,...
Emulateur de microprocesseur 6502
Texte séquentiel
IPaymt/Interet
NPer
PPaymt/Principal
Distance en Km entre deux longitudes et latitudes
Méridien de Paris
Triangulation d'une position (trilateration,...)
Aire d'un cercle
Aire d'une surface de prisme rectangulaire
Aire d'un triangle
Distance entre deux points
Treillis
Chiffre romain
Méthode du chiffre César (code César)
Asteroids
Bowling
Breakout
Lode Runner
Missile Command
Pac-Man
Patience
Peg Leap
Soko-Ban
Space Invaders
Space Jockey
Tetris
Tic-Tac-Toe
Tours d'Hanois
Ackermann
Exp
Factoriel
Fibonacci
Log
Nombre premier
Odd
Random
Sqrt
Triangle Pascal
Sommation
Hauteur utérine
Calcul de votre poids santé (IMC)
Unité de mesure
Fréquence des vagues
Hockey
Année bissextile
Calendrier
Date de la Pâque
FirstDayOfMonth
Horloge à aiguille
Tri à bulle (Bubble Sort)
Tri Shell Sort
ArcCos
ArcSin
Atn/ATan/ArcTan/ArcTangente
Cos
Sin
Courriel
AMDEKSYSTEM88LIB-TP
APMLIB-TP
BASICSTRLIB-TP
BIOSLIB-TP
COLORIMETRYLIB-TP
CSVLIB-TP
CYRIXLIB-TP
DRDOSLIB-TP
ELECTRICLIB-TP
ERLOGLIB-TP
FINANCIALLIB-TP
GEOLIB-TP
GRAPHICSSOLUTIONLIB-TP
HDLLIB-TP
HISTORICLIB-TP
HTMLLIB-TP
IALIB-TP
INTLLIB-TP
JSONLIB-TP
K8042LIB-TP
LETTRESLIB-TP
LOTUSSCRIPTSTRLIB-TP
METEOLIB-TP
OCEANOGRAPHICLIB-TP
OS2LIB-TP
OSSPASCALLIB-TP
POSIX-TP
PYTHONLIB-TP
SANE-TP
SNOBOLLIB-TP
SVGLIB-TP
TPW4TPLIB-TP
TSENGLABSET4000LIB-TP
VGALIB-TP
WINDOWS9XLIB-TP
XMLLIB-TP
Turbo Vision
UNITEST
MOS
AlimBase
AMIGADOS-0
AXTRO
Colorix
Corail
COREUTILS-0
DEV-COOLS
EDUX
FLEX-0
GEO-COMMANDER
HISTORIK
lettrex
LINUX-0
MATHIX
METEOPOLIS
Micro Calc
MYSTIX
Monsterbook
MSDOS-0
MSXDOS-0
OS9-0
Renegade BBS
Système Information
TRSDOS-0
Turbo Calc
UNIX-0
VIE
7iles
Arkanoid
Digger
Mario and Luigi
Turbo Assembler
Turbo Debugger
DOSBox
PCE - PC Emulator
PCem
Base de connaissances
Table ASCII
Table de codes ANSI et page de codes
RAM de l'IBM PC
Code d'erreur
Génération du code en interne du Turbo Pascal 3
Code source du Turbo Pascal 6
TPU
OBJ
Archives de paquet
Alternative
Bibliographie
Turbo Pascal à FreeDOS/FreePascal
Turbo Pascal à Linux/FreePascal
Turbo Pascal à FreeBSD/FreePascal
Turbo Pascal à eComStation/FreePascal
Préface
Notes légal
Dictionnaire
Recherche

Les expressions

Les expressions sont constituées d'opérateurs et d'opérandes. La plupart des opérateurs Turbo Pascal sont binaires ; ils prennent deux opérandes. Les autres sont unaires et ne prennent qu'un seul opérande. Les opérateurs binaires utilisent le format algébrique habituelle (par exemple, A + B). Un opérateur unaire précède toujours son opérande (par exemple, -B). Dans les expressions plus complexes, les règles de priorité clarifient l'ordre dans lequel les opérations sont effectuées.

Opérateurs Priorité Catégories
@, not Premier (haute) Opérateurs unaires
*, /, div, mod, and, shl, shr Deuxième Opérateurs multiplicateurs
+, - , or, xor Troisième Ajout d'opérateurs
=, <>, <, >, <=, >=, in Quatrième (basse) Opérateurs relationnels

Il existe 3 règles de préséance de base :

Les opérations avec une priorité égale sont normalement effectuées de gauche à droite, bien que le compilateur puisse réorganiser les opérandes pour générer un code optimal.

Syntaxe d'expression

Les règles de priorité découlent de la syntaxe des expressions, étant construites à partir de facteurs, de termes et d'expressions simples. La syntaxe d'un facteur est la suivante :

Un appel de fonction active une fonction et indique la valeur renvoyée par la fonction. Un constructeur d'ensemble désigne une valeur d'un type d'ensemble. Un transtypage de valeur change le type d'une valeur. Un facteur d'adresse calcule l'adresse d'une variable, d'une procédure, d'une fonction ou d'une méthode. Une constante non signée a la syntaxe suivante :

Voici quelques exemples de facteurs :

  1. X                           { Référence de variable }
  2. @X                          { Pointeur vers une variable }
  3. 15                          { Constante non-signé }
  4. (X + Y + Z)                 { Sous-expression }
  5. Sin(X / 2)                  { Appel de fonction }
  6. exit ['0'..'9','A'..'Z']    { Constructeur d'ensemble }
  7. Not Done                    { Négation d'un Booléen }
  8. Char(Digit + 48)            { Castre de valeur }

Les termes appliquent les opérateurs multiplicateurs aux facteurs :

Voici quelques exemples de termes :

  1. X * Y
  2. Z / (1 - Z)
  3. Y shl 2
  4. (X <= Y) and (Y < Z)

Des expressions simples appliquent l'ajout d'opérateurs et de signes aux termes :

Voici quelques exemples d'expressions simples :

  1. X + Y
  2. -X
  3. Hue1 + Hue2
  4. I * J + 1

Une expression applique les opérateurs relationnels à des expressions simples :

Voici quelques exemples d'expressions :

  1. x = 1.5
  2. Done <> Error
  3. (I < J) = (J < K)
  4. C in Huel

Les opérateurs

Les opérateurs sont classés en opérateurs arithmétiques, opérateurs logiques, opérateurs de chaîne de caractères, opérateurs de pointeur de caractère, opérateurs d'ensemble, opérateurs relationnels et opérateur @.

Opérateurs arithmétiques

Les tableaux suivants présentent les types d'opérandes et les résultats des opérations arithmétiques binaires et unaires.

Opérateur Opération Types d'opérandes Type de résultat
+ Addition Type d'entier
Type de réel
Type d'entier
Type de réel
- Soustraction Type d'entier
Type de réel
Type d'entier
Type de réel
* Multiplication Type d'entier
Type de réel
Type d'entier
Type de réel
/ Division Type de réel Type de réel
DIV Division entière Type d'entier Type d'entier
MOD Restant de division Type d'entier Type d'entier
+ Identité de signe Type d'entier
Type de réel
Type d'entier
Type de réel
- Identité de signe Type d'entier
Type de réel
Type d'entier
Type de réel

Tout opérande dont le type est une sous-gamme d'un type ordinal est traité comme s'il était de type ordinal. Si les deux opérandes d'un opérateur +, -, *, div ou mod sont de type entier, le type de résultat est du type commun aux deux opérandes. Si un ou les deux opérandes d'un opérateur +, - ou * sont de type réel, le type du résultat est Real dans l'état {$N-} ou Extended dans l'état {$N+}.

Si l'opérande de l'opérateur d'identité de signe ou de négation de signe est de type entier, le résultat est du même type entier. Si l'opérateur est de type réel, le type du résultat est Real ou Extended. La valeur de X / Y est toujours de type Real ou Extended quels que soient les types d'opérandes. Une erreur d'exécution se produit si Y est égal à zéro.

La valeur de I div J est le quotient mathématique de I / J, arrondi dans le sens zéro à une valeur de type entier. Une erreur d'exécution se produit si J est égal à zéro. L'opérateur mod renvoie le reste obtenu en divisant ses deux opérandes ; C'est par exemple :

  1. I mod J = I - (I div J) * J

Le signe du résultat de mod est le même que le signe de I. Une erreur d'exécution se produit si J est égal à zéro.

Opérateurs logiques

Les types d'opérandes et les résultats des opérations logiques sont indiqués dans le tableau suivant :

Opérateur Opération Types d'opérandes Type de résultat
NOT Négation binaire Type entier Boolean
AND Et binaire Type entier Boolean
OR Ou binaire Type entier Boolean
XOR Ou exclusif binaire Type entier Boolean
SHL Décalage vers la gauche Type entier Boolean
SHR Décalage vers la droite Type entier Boolean

Si l'opérande de l'opérateur NOT est de type entier, le résultat est du même type entier. Si les deux opérandes d'un opérateur AND, OR, ou XOR sont de type entier, le type de résultat est le type commun des deux opérandes. Les opérations I shl J et I shr J décalent la valeur de I vers la gauche à droite de J bits. Le type de résultat est le même que le type de I.

Opérateurs booléens

Les types d'opérandes et les résultats des opérations booléennes sont indiqués dans le tableau suivant :

Opérateur Opération Types d'opérandes Type de résultat
NOT Négation Type booléen Boolean
AND Et logique Type booléen Boolean
OR Ou logique Type booléen Boolean
XOR Ou exclusif logique Type booléen Boolean

La logique booléenne normale régit les résultats de ces opérations. Par exemple, A et B sont vrais uniquement si A et B sont TRUE. Le Turbo Pascal prend en charge deux modèles différents de génération de code pour les opérateurs AND et OR : évaluation complète et évaluation (partielle) de court-circuit.

Une évaluation complète signifie que chaque opérande d'une expression booléenne construite à partir des opérateurs et et ou est assuré d'être évalué, même lorsque le résultat de l'expression entière est déjà connu. Ce modèle est pratique lorsqu'un ou plusieurs opérandes d'une expression sont des fonctions avec des effets secondaires qui modifient le sens du programme.

L'évaluation en court-circuit garantit une évaluation stricte de gauche à droite et cette évaluation s'arrête dès que le résultat de l'expression entière devient évident. Ce modèle est pratique dans la plupart des cas car il garantit un temps d'exécution minimum et généralement une taille de code minimum. L'évaluation en court-circuit permet également l'évaluation de constructions n'étant pas légales autrement. Par exemple :

  1. While (I <= Length(S)) and (S[I] <> ' ') do Inc(I);
  2. While (P <> nil) and (P^.Value <> 5) do P := P^.Next;

Dans les deux cas, le deuxième test n'est pas évalué si le premier test est FALSE. Le modèle d'évaluation est contrôlé par la directive du compilateur $B. L'état par défaut est {$B-}, et dans cet état, le compilateur génère un code d'évaluation de court-circuit. Dans l'état {$B+}, le compilateur génère une évaluation complète. Étant donné que le Pascal standard ne spécifie pas quel modèle doit être utilisé pour l'évaluation des expressions booléennes, les programmes dépendant de l'un ou l'autre modèle ne sont pas vraiment portables. Vous pouvez cependant décider que sacrifier la portabilité vaut le gain de vitesse d'exécution et de simplicité fourni par le modèle de court-circuit.

Opérateur de chaîne de caractères

Les types d'opérandes et les résultats pour l'opération de chaîne de caractères sont indiqués dans le tableau suivant :

Opérateur Opération Types d'opérandes Type de résultat
+ Concaténation Type STRING, Type CHAR ou un type PACKED STRING Type chaîne de caractères

Le Turbo Pascal permet à l'opérateur + d'être utilisé pour concaténer deux opérandes de chaîne de caractères. Le résultat de l'opération 5 + T, où S et T sont d'un type chaîne de caractères, d'un type Char ou d'un type chaîne de caractères compactée, est la concaténation de S et T. Le résultat est compatible avec n'importe quel type de chaîne (mais pas avec Char types et types de chaînes compactées). Si la chaîne de caractères résultante dépasse 255 caractères, elle est tronquée après le caractère 255.

Opérateurs de pointeur de caractère

La syntaxe étendue (activée à l'aide d'une directive de compilateur {$X+}) prend en charge un certain nombre d'opérations de pointeur de caractère. Les opérateurs plus (+) et moins (-) peuvent être utilisés pour incrémenter et décrémenter la partie décalée d'une valeur de pointeur, et l'opérateur moins peut être utilisé pour calculer la distance (différence) entre les parties décalées de deux pointeurs de caractères. En supposant que P et Q sont des valeurs de type PChar et I une valeur de type de données Word, ces constructions sont autorisées :

Opération Résultat
P + I Ajouter I à la partie déplacée de P
I + P Ajouter I à la partie déplacée de P
P - I Soustraire I de la partie déplacée de P
P - Q Soustraire la partie déplacée de Q de la partie déplacée de P

Les opérations P + I et I + P ajoutent I à l'adresse donnée par P, produisant un pointeur pointant I caractères après P. L'opération P - I soustrait I de l'adresse donnée par P, produisant un pointeur pointant I caractères avant P. L'opération P - Q calcule la distance entre Q (l'adresse inférieure) et P (l'adresse supérieure), résultant en une valeur de type Word donnant le nombre de caractères entre Q et P. Cette opération suppose que P et Q pointent dans le même tableau de caractères. Si les deux pointeurs de caractères pointent vers des tableaux de caractères différents, le résultat n'est pas défini.

Opérateurs SET

Les types d'opérandes pour les opérations d'ensembles sont indiqués dans le tableau suivants :

Opérateur Opération Types d'opérande
+ Union Compatible au types SET
- Différence Compatible au types SET
* Intersection Compatible au types SET

Les résultats des opérations d'ensembles sont conformes aux règles de la logique ensemble :

Si la plus petite valeur ordinale membre du résultat d'une opération ensembliste est A et la plus grande est B, alors le type du résultat est l'ensemble A..B.

Opérateurs relationnels

Les types d'opérandes et les résultats des opérations relationnelles sont indiqués dans le tableau suivant :

Opérateur Opération Types d'opérandes Type de résultat
= Égalité Types compatibles simple, pointeur, ensemble, chaîne de caractères ou PACKED STRING Boolean
<> Pas d'égalité Types compatibles simple, pointeur, ensemble, chaîne de caractères ou PACKED STRING Boolean
< Inférieur à Types compatibles simple, chaîne de caractères, PACKED STRING ou PChar Boolean
> Supérieur à Types compatibles simple, chaîne de caractères, PACKED STRING ou PChar Boolean
<= Inférieur ou égale à Types compatibles simple, chaîne de caractères, PACKED STRING ou PChar Boolean
>= Supérieur ou égale à Types compatibles simple, chaîne de caractères, PACKED STRING ou PChar Boolean
<= Sous-ensemble de Types compatible d'ensemble Boolean
>= Super-ensemble de Types compatible d'ensemble Boolean
IN Membre de Opérande gauche, tout type ordinal T ; opérande droit, ensemble dont la base est compatible avec T Boolean

Comparer des types simples

Lorsque les opérandes =, <>, <, >, >= ou <= sont de types simples, ils doivent être de types compatibles ; cependant, si un opérande est de type réel, l'autre peut être de type entier.

Comparer des chaînes de caractères

Les opérateurs relationnels =, <>, <, >, >= et <= comparent les chaînes de caractères en fonction de l'ordre de l'ensemble de caractères ASCII étendu. Deux valeurs de chaîne de caractères peuvent être comparées car toutes les valeurs de chaîne de caractères sont compatibles.

Une valeur de type caractère est compatible avec une valeur de type chaîne de caractères. Lorsque les deux sont comparés, la valeur de type caractère est traitée comme une valeur de type chaîne de caractères de longueur 1. Lorsqu'une valeur de type chaîne de caractères PACKED avec N composantes est comparée à une valeur de type chaîne de caractères, elle est traitée comme une valeur de type chaîne de caractères de longueur N.

Comparer des chaînes de caractères PACKED

Les opérateurs relationnels =, <>, <, >, >= et <= peuvent également être utilisés pour comparer deux valeurs de type chaîne de caractères PACKED si les deux ont le même nombre de composantes. Si le nombre de composantes est N, alors l'opération correspond à la comparaison de deux chaînes de caractères, chacune de longueur N.

Comparer des pointeurs

Les opérateurs = et <> peuvent être utilisés sur des opérandes de type pointeur compatibles. Deux pointeurs ne sont égaux que s'ils pointent sur le même objet.

Comparer les pointeurs de caractères

La syntaxe étendue (activée à l'aide d'une directive de compilateur {$X+}) permet aux opérateurs >, <, >= et <= d'être appliqués aux valeurs PChar. Notez, cependant, que ces tests relationnels supposent que les deux pointeurs comparés pointent dans le même tableau de caractères, et pour cette raison, les opérateurs ne comparent que les parties décalées des deux valeurs de pointeur. Si les deux pointeurs de caractères pointent vers des tableaux de caractères différents, le résultat n'est pas défini.

Comparer des ensembles

Si A et B sont des opérandes d'ensembles, leurs comparaisons produisent les résultats suivants :

Appartenance à l'ensemble de test

L'opérateur in renvoie True lorsque la valeur de l'opérande de type ordinal est membre de l'opérande de type set ; sinon, il renvoie False.

L'opérateur @

L'opérateur @ est utilisé dans un facteur d'adresse pour calculer l'adresse d'une variable, d'une procédure, d'une fonction ou d'une méthode.

L'opérateur @ renvoie l'adresse de son opérande, c'est-à-dire qu'il construit une valeur de pointeur pointant vers l'opérande.

@ avec une variable

Lorsqu'il est appliqué à une référence de variable, @ renvoie un pointeur vers la variable. Le type de la valeur de pointeur résultante est contrôlé par la directive du compilateur $T : dans l'état {$T-} (par défaut), le type de résultat est Pointer. En d'autres termes, le résultat est un pointeur non typé, étant compatible avec tous les autres types de pointeur. Dans l'état {$T+}, le type du résultat est ^T, où T est le type de la référence de la variable. En d'autres termes, le résultat est d'un type n'étant compatible qu'avec d'autres pointeurs sur le type de la variable.

Vous pouvez appliquer @ à une procédure, une fonction ou une méthode pour produire un pointeur vers le point d'entrée de la routine. Le type du pointeur résultant est toujours Pointer, quel que soit l'état de la directive du compilateur $T. En d'autres termes, le résultat est toujours un pointeur non typé, étant compatible avec tous les autres types de pointeur.

Lorsque @ est appliqué à une méthode, la méthode doit être spécifiée via un identificateur de méthode qualifié (un identificateur de type objet, suivi d'un point, suivi d'un identificateur de méthode).

Appels de fonction

Un appel de fonction active une fonction spécifiée par un identificateur de fonction, un indicateur de méthode, un indicateur de méthode qualifié ou une référence de variable de type procédural. L'appel de fonction doit avoir une liste de paramètres réels si la déclaration de fonction correspondante contient une liste de paramètres formels.

Voici quelques exemples d'appels de fonction :

  1. Somme(A,73)
  2. Maximum(157,J)
  3. Sin(X+Y)
  4. Eof(F)
  5. Volume(Rayon,Hauteur)

Dans le mode de syntaxe étendue {$X+}, les appels de fonction peuvent être utilisés comme des instructions ; c'est-à-dire que le résultat d'un appel de fonction peut être ignoré.

Les constructeurs d'ensemble

Un constructeur d'ensemble désigne une valeur de type ensemble et est formé en écrivant des expressions entre crochets ([]). Chaque expression désigne une valeur de l'ensemble.

La notation [ ] désigne l'ensemble vide, étant compatible avec l'affectation avec chaque type d'ensemble. Tout groupe de membres X..Y désigne comme membres de l'ensemble toutes les valeurs de l'intervalle X..Y. Si X est supérieur à Y, alors X..Y ne désigne aucun membre et [X..Y] désigne l'ensemble vide. Toutes les valeurs d'expression dans les groupes membres d'un constructeur d'ensemble particulier doivent être du même type ordinal. Voici quelques exemples de constructeurs d'ensembles :

  1. [rouge, C, vert]
  2. [1, 5, 10..K mod 12, 23)
  3. ['A'..'Z', 'a'..'z', Chr(Chiffre + 48)]

Castre de valeur

Le type d'une expression peut être changé en un autre type via un castre (transtypage) de valeur.

Le type d'expression et le type spécifié doivent tous deux être des types ordinaux ou des types pointeurs. Pour les types ordinaux, la valeur résultante est obtenue en convertissant l'expression. La conversion peut impliquer une troncature ou une extension de la valeur d'origine si la taille du type spécifié est différente de celle de l'expression. Dans les cas où la valeur est étendue, le signe de la valeur est toujours conservé ; c'est-à-dire que la valeur est étendue par le signe.

La syntaxe d'un castre de valeur est presque identique à celle d'un castre de variable. Les castres de valeurs opèrent sur des valeurs, mais pas sur des variables, et par conséquent, ils ne peuvent pas participer aux références de variables ; c'est-à-dire qu'un castre de valeur ne peut pas être suivi de qualificateurs. En particulier, les castres de valeur ne peuvent pas apparaître sur le côté gauche d'une instruction d'affectation.

Voici quelques exemples de castre (transtypages) de valeurs :

  1. Integer('A')
  2. Char(48)
  3. Boolean(0)
  4. Couleur(2)
  5. LongInt(@tampon)
  6. BytePtr(Ptr($40,$49))

Types procéduraux dans les expressions

Généralement, l'utilisation d'une variable procédurale dans une instruction ou une expression appelle la procédure ou la fonction entreposée dans la variable. Il y a une exception : lorsque le compilateur voit une variable procédurale sur le côté gauche d'une instruction d'affectation, il sait que le côté droit doit représenter une valeur procédurale. Par exemple, considérons le programme suivant :

  1. Type
  2.  IntFunc = Function:Integer;
  3.  
  4. Var
  5.  F:IntFunc;
  6.  N:Integer;
  7.  
  8. Function ReadInt:Integer;Far;
  9. Var
  10.  I:Integer;
  11. Begin
  12.  Read(I);
  13.  ReadInt:=I;
  14. End;
  15.  
  16. BEGIN
  17.  F:=ReadInt;
  18.  N:=ReadInt;
  19. END.

La première instruction dans le programme principal affecte la valeur procédurale (adresse de) ReadInt à la variable procédurale F, où la deuxième instruction appelle ReadInt et affecte la valeur renvoyée à N. La distinction entre obtenir la valeur procédurale ou appeler la fonction est faite par le type de la variable affectée (F ou N). Malheureusement, il existe des situations où le compilateur ne peut pas déterminer l'action souhaitée à partir du contexte. Par exemple, dans l'instruction suivante, il n'y a aucun moyen évident pour le compilateur de savoir s'il doit comparer la valeur procédurale de F à la valeur procédurale de ReadInt pour déterminer si F pointe actuellement vers ReadInt, ou s'il doit appeler F et ReadInt, puis comparer les valeurs renvoyées.

  1. If F = ReadInt Then WriteLn('Égalité');

La syntaxe Pascal standard, cependant, spécifie que l'occurrence d'un identificateur de fonction dans une expression dénote un appel à cette fonction, donc l'effet de l'instruction précédente est d'appeler F et ReadInt, puis de comparer les valeurs renvoyées. Pour comparer la valeur procédurale de F à la valeur procédurale de ReadInt, la construction suivante doit être utilisée :

  1. If @F = @ReadInt Then Writeln('Égalité');

Lorsqu'il est appliqué à une variable procédurale ou à un identifiant de procédure ou de fonction, l'opérateur d'adresse (@) empêche le compilateur d'appeler la procédure et convertit en même temps le paramètre en un pointeur. @F convertit F en une variable pointeur non typée contenant une adresse, et @ReadInt renvoie l'adresse de ReadInt ; les deux valeurs de pointeur peuvent ensuite être comparées pour déterminer si F se réfère actuellement à ReadInt. L'opérateur @ est souvent utilisé lors de l'affectation d'une valeur de pointeur non typée à une variable procédurale. Voici un exemple :

  1. Procedure SomeProc;Begin
  2.  { : }
  3. End;
  4.  
  5. Var
  6.  SomePtr:Pointer;
  7.  
  8. BEGIN
  9.  { : } 
  10.  SomePtr:=@SomeProc;
  11.  { : }  
  12. END.

Pour obtenir l'adresse mémoire d'une variable procédurale plutôt que l'adresse y étant entreposée, utilisez un opérateur double adresse (@@). Par exemple, où @P signifie convertir P en une variable pointeur non typée, @@P signifie retourner l'adresse physique de la variable P.



PARTAGER CETTE PAGE SUR
Dernière mise à jour : Vendredi, le 31 décembre 2021