Difference between revisions of "Conceitos básicos: D"
From AdonaiMedrado.Pro.Br
(→for) |
(→Estrutura de repetição) |
||
Line 172: | Line 172: | ||
</code> | </code> | ||
− | === | + | === foreach === |
+ | |||
==== Especificação ==== | ==== Especificação ==== | ||
<code lang="c"> | <code lang="c"> | ||
+ | ForeachStatement: | ||
+ | Foreach (ForeachTypeList; Aggregate) ScopeStatement | ||
+ | Foreach: | ||
+ | foreach | ||
+ | foreach_reverse | ||
+ | ForeachTypeList: | ||
+ | ForeachType | ||
+ | ForeachType , ForeachTypeList | ||
+ | ForeachType: | ||
+ | inout Type Identifier | ||
+ | Type Identifier | ||
+ | inout Identifier | ||
+ | Identifier | ||
+ | Aggregate: | ||
+ | Expression | ||
+ | Tuple | ||
+ | </code> | ||
+ | |||
+ | ==== Exemplo 1 ==== | ||
+ | Exemplo também é válido para foreach_reverse. | ||
+ | |||
+ | <code lang="d"> | ||
+ | char[] a; | ||
+ | ... | ||
+ | foreach (int i, char c; a) | ||
+ | { | ||
+ | printf("a[%d] = '%c'\n", i, c); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Exemplo 2 ==== | ||
+ | Exemplo também é válido para foreach_reverse. | ||
+ | |||
+ | <code lang="d"> | ||
+ | foreach (char c; "ab") | ||
+ | { | ||
+ | printf("'%c'\n", c); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Exemplo 3 ==== | ||
+ | Exemplo abaixo '''não''' é válido para foreach_reverse. | ||
+ | |||
+ | <code lang="d"> | ||
+ | double[char[]] a; | ||
+ | ... | ||
+ | foreach (char[] s, double d; a) | ||
+ | { | ||
+ | printf("a['%.*s'] = %g\n", s, d); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Exemplo 4 ==== | ||
+ | O segundo parâmetro de foreach ou foreach_reverse pode ser uma classe desde que ela implemente o operador opApply e/ou opApplyReverse respectivamente. | ||
+ | |||
+ | <code lang="d"> | ||
+ | class Foo | ||
+ | { | ||
+ | uint array[2]; | ||
+ | int opApply(int delegate(inout uint) dg) | ||
+ | { | ||
+ | int result = 0; | ||
+ | for (int i = 0; i < array.length; i++) | ||
+ | { | ||
+ | result = dg(array[i]); | ||
+ | if (result) | ||
+ | break; | ||
+ | } | ||
+ | return result; | ||
+ | } | ||
+ | } | ||
+ | void test() | ||
+ | { | ||
+ | Foo a = new Foo(); | ||
+ | a.array[0] = 73; | ||
+ | a.array[1] = 82; | ||
+ | foreach (uint u; a) | ||
+ | { | ||
+ | printf("%d\n", u); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | === while === | ||
+ | ==== Especificação ==== | ||
+ | <code lang="d"> | ||
WhileStatement: | WhileStatement: | ||
while ( Expression ) ScopeStatement | while ( Expression ) ScopeStatement | ||
Line 180: | Line 267: | ||
==== Exemplo ==== | ==== Exemplo ==== | ||
− | <code lang=" | + | <code lang="d"> |
int i = 0; | int i = 0; | ||
while (i < 10) | while (i < 10) |
Revision as of 19:52, 2 April 2009
Contents
Tipos básicos [1]
void no type - bool = false byte (8 bits com sinal) = 0 ubyte (8 bits sem sinal) = 0 short (16 bits com sinal) = 0 ushort (16 bits sem sinal) = 0 int (32 bits com sinal) = 0 uint (32 bits sem sinal) 0 long (64 bits com sinal) = 0L ulong (64 bits sem sinal) = 0L cent (128 bits com sinal - reservado) = 0 ucent (128 bits sem sinal - reservado) = 0 float (ponto flutuante de 32 bits) = float.nan double (ponto flutuante de 64 bits) = double.nan real (maior ponto flutuante implementado pelo hardware) real.nan ifloat (float imaginário) = float.nan * 1.0i idouble (double imaginário) = double.nan * 1.0i ireal (real imaginário) = real.nan * 1.0i cfloat (número complexo com dois valores float) = float.nan + float.nan * 1.0i cdouble (número complexo com dois valores double) = double.nan + double.nan * 1.0i creal (número complexo com dois valores real) = real.nan + real.nan * 1.0i char (8 bits sem sinal - UTF-8) = 0xFF wchar (16 bits sem sinal - UTF-16) = 0xFFFF dchar (32 bits sem sinal - UTF-32) = 0x0000FFFF
Vetores e matrizes [1]
Ponteiro
int *p;
Vetor estático
int[3] s; int s[3];
Tamanho máximo: 16Mb.
Vetor dinâmico
int[] a; int a[];
Vetor associado
int[char[]] x;
Ponteiro para vetor dinâmico
int[]* e; int (*e)[];
Ponteiros para vetores
int*[]*[3] d; int*[]* d[3]; int* (*d[3])[];
Matrizes estáticas
int[4][3] b; int[4] b[3]; int b[3][4];
Matrizes dinâmicas
int[][5] c; int[] c[5]; int c[5][];
Slicing
int[10] a; int[] b; b = a[1..3]; // a[1..3] representa um array de 2 elementos (a[1] and a[2]).
Atribuição
int[3] s; int[3] t; s[0..2] = t[1..3]; // mesmo que s[0] = t[1], s[1] = t[2]. s[] = 3; // mesmo que s[0] = 3, s[1] = 3, s[2] = 3. p[0..2] = 3; // mesmo que p[0] = 3, p[1] = 3.
Concatenação
int[] a; int[] b; int[] c; a = b ~ c; // cria um array resultado da concatenção d b com c. a ~= b; // concatena b ao array a.
Estruturas condicionais
if
Especificação
IfStatement: if ( IfCondition ) ThenStatement if ( IfCondition ) ThenStatement else ElseStatement IfCondition: Expression auto Identifier = Expression Declarator = Expression ThenStatement: ScopeStatement ElseStatement: ScopeStatement
Exemplo
if (...) { ... } else { ... }
switch
? :
Estrutura de repetição
for
Especificacão
ForStatement: for (Initialize Test; Increment) ScopeStatement Initialize: ; NoScopeNonEmptyStatement Test: empty Expression Increment: empty Expression
Exemplo
for (int i = 0; i < 10; i++) foo(i);
Atenção:
for (int i = 0; i < 10; i++) ; //isto não é permitido. for (int i = 0; i < 10; i++) {} //mas isto sim.
foreach
Especificação
ForeachStatement: Foreach (ForeachTypeList; Aggregate) ScopeStatement Foreach: foreach foreach_reverse ForeachTypeList: ForeachType ForeachType , ForeachTypeList ForeachType: inout Type Identifier Type Identifier inout Identifier Identifier Aggregate: Expression Tuple
Exemplo 1
Exemplo também é válido para foreach_reverse.
char[] a; ... foreach (int i, char c; a) { printf("a[%d] = '%c'\n", i, c); }
Exemplo 2
Exemplo também é válido para foreach_reverse.
foreach (char c; "ab") { printf("'%c'\n", c); }
Exemplo 3
Exemplo abaixo não é válido para foreach_reverse.
double[char[]] a; ... foreach (char[] s, double d; a) { printf("a['%.*s'] = %g\n", s, d); }
Exemplo 4
O segundo parâmetro de foreach ou foreach_reverse pode ser uma classe desde que ela implemente o operador opApply e/ou opApplyReverse respectivamente.
class Foo { uint array[2]; int opApply(int delegate(inout uint) dg) { int result = 0; for (int i = 0; i < array.length; i++) { result = dg(array[i]); if (result) break; } return result; } } void test() { Foo a = new Foo(); a.array[0] = 73; a.array[1] = 82; foreach (uint u; a) { printf("%d\n", u); } }
while
Especificação
WhileStatement: while ( Expression ) ScopeStatement
Exemplo
int i = 0; while (i < 10) { foo(i); i++; }
do...while
Especificação
DoStatement: do ScopeStatement while ( Expression )
Exemplo
int i = 0; do { foo(i); } while (++i < 10);
Declaração
Bloco
Função
Classe
Referências
- ↑ 1.0 1.1 D Specification em http://www.prowiki.org/upload/duser/spec_DMD_1.00.pdf