Ir para conteúdo
Fórum Script Brasil
  • 0

Operadores.net


Denis Bittencourt Muniz

Pergunta

Fala galera! beleza?

Queria tirar alguma dúvidas sobre operadores, comparando VB.net com C#:

Divisão (que retrona inteiro)

VB.net: \

C#: /1 <- Mas não conseguir usar, alguém poderia postar um exemplo? Eu tentei 15 /1 2, mas não deu certo.

Exponencial

VB.net: ^

C#: <-No caso, o C# não teria um operador para esse tipo de operação? Ou é obrigado usar o método 'pow' da classe 'Math'?

Null coalescing (nome, em inglês)

VB.net: <-No caso, o VB não teria um operador para esse tipo de operação?

C#: ??

Hum... a propósito, para que serve esse operador? Algum exemplo?

Bit shift

O que fazem esses operadores? Sei que tem o direito e o esquerdo.. mas?? Gostaria de um exemplo também, se possível.

Bitwise And, Or e Xor

Esses seriam os operadores que fazem comparação Bit-a-Bit? Por exemplo: 6 And 2, retorna 2, certo? Se for, o Graymalkin tinha explicado isso lá na sala de VB.

valeu!

Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

Fala mlk! beleza?

valeu! Eu vou até dar uma lida, pois estou entrando no 'mundo' Visual Basic.net. Mas as dúvidas ficaram, pois é dúvida sobre operadores do C# e operadores Bit-a-Bit. Só fiz uma pergunta em relação ao VB.net, alias, melhor dizendo: curiosidade em saber se o VB.net tem algo equivalente a '??' do C#.

Mas valeu pelo tutorial do macoratti! Porém, espero respostas sobre os operadores : )

Falows!

Link para o comentário
Compartilhar em outros sites

  • 0

Fala galera! beleza?

Queria tirar alguma dúvidas sobre operadores, comparando VB.net com C#:

Divisão (que retrona inteiro)

VB.net: \

C#: /1                    <- Mas não conseguir usar, alguém poderia postar um exemplo? Eu tentei 15 /1 2, mas não deu certo.

Nunca vi esse operador não. A divisão inteira em C# é executada quando ambos os elementos são inteiros. Faça o teste (usei um WebForm no exemplo, mas você pode trocar por MessageBoxes em WindowsForms):

  	int i = 15;
  	int j = 4;

  	Response.Write(i/j);
  	Response.Write(i/(double)j);
  	Response.Write((double)i/j);
Exponencial VB.net: ^ C#:              <-No caso, o C# não teria um operador para esse tipo de operação? Ou é obrigado usar o método 'pow' da classe 'Math'?
Não, não tem. Só mesmo utilizando Math.pow().
Null coalescing (nome, em inglês) VB.net:            <-No caso, o VB não teria um operador para esse tipo de operação? C#: ?? Hum... a propósito, para que serve esse operador? Algum exemplo?
Onde você encontrou esse operador? unsure.gif Não seria o operador condicional (?)? Se for, ele é igual ao Iif() do VB, que testa uma condição e retorna um dos outros dois parâmetros passados.
Bit shift O que fazem esses operadores? Sei que tem o direito e o esquerdo.. mas?? Gostaria de um exemplo também, se possível.
Deslocam um bit para a direita ou para a esquerda. Por exemplo:
  	int i = 2;
  	int j = i >> 1;
  	int k = i << 1;

No caso acima, j vai ser 1, porque 2 em binário é "10" e se deslocarmos o primeiro bit para a direita (>>) teremos "01", que é 1 em decimal. E k vai ser 4, porque se delocarmos o primeiro bit de "10" (2 em decimal) para a esquerda, teremos "100" que é 4 em decimal. Sacou? wink.gif

Bitwise And, Or e Xor

Esses seriam os operadores que fazem comparação Bit-a-Bit? Por exemplo: 6 And 2, retorna 2, certo? Se for, o Graymalkin tinha explicado isso lá na sala de VB.

Exatamente.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Hum... valeu Graymalkin. Sobre o operador '??': Vi ele na referência do C# 2.0 no VS2005. O mesmo aconteceu com o operador '/1'.

Qualquer novidade, post, certo?

Falows!

Link para o comentário
Compartilhar em outros sites

  • 0
Hum... valeu Graymalkin. Sobre o operador '??': Vi ele na referência do C# 2.0 no VS2005. O mesmo aconteceu com o operador '/1'.

Ah tá. Eu ainda não instalei o VS2005 aqui, por isso não estou muito a par das novidades.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Fala rodfraga e Graymalkin, beleza?

Aqui a documentação do VS2005, logo abaixo:

The ?? operator returns the left-hand operand if it is not null, or else it returns the right operand.

->Remarks

A nullable type can contain a value, or it can be undefined. The ?? operator defines the default value to be returned when a nullable type is assigned to a non-nullable type. If you try to assign a nullable type to a non-nullable type without using the ?? operator, you will generate a compile-time error. If you use a cast, and the nullable type is currently undefined, an InvalidOperationException exception will be thrown.

For more information, see Nullable Types (C# Programming Guide).

Example

Copy Code

// nullable_type_operator.cs

using System;

class MainClass

{

static int? GetNullableInt()

{

return null;

}

static string GetStringValue()

{

return null;

}

static void Main()

{

// ?? operator example.

int? x = null;

// y = x, unless x is null, in which case y = -1.

int y = x ?? -1;

// Assign i to return value of method, unless

// return value is null, in which case assign

// default value of int to i.

int i = GetNullableInt() ?? default(int);

string s = GetStringValue();

// ?? also works with reference types.

// Display contents of s, unless s is null,

// in which case display "Unspecified".

Console.WriteLine(s ?? "Unspecified");

}

}

Falows! Feliz Ano Novo galera!

Link para o comentário
Compartilhar em outros sites

  • 0

Oi!, desculpa a demora, eu estava comemorando a chegada de 2006.

FELIZ ANO NOVO PRA VOCÊS! laugh.gif

Olha, Denis, você pode me dizer se essa documentação você achou no Help do VS2005 ou no VS2005 Express?

Porque eu tenho o Express e queria dar uma olhada nesse "Para mais informações" e ver com cuidado.

Abraços

Rodrigo

Link para o comentário
Compartilhar em outros sites

  • 0

Bom rodfraga, uso o Visual C# 2005 Express... Você irá achar as informações no menu 'Help' -> 'Contents'. Pronto, agora você faz a pesquisa entre os tópicos. Dê uma olhada no operador '??', certo?

Aproveitando o tópico, registrar o VS Express é "FREE"?, pelo menos foi que li no próprio VS2005, onde aparece uma informação sobre o trial, na bandeja do sistema..

Falows! Espero respostas : )

Link para o comentário
Compartilhar em outros sites

  • 0

Bom rodfraga, uso o Visual C# 2005 Express... Você irá achar as informações no menu 'Help' -> 'Contents'. Pronto, agora você faz a pesquisa entre os tópicos. Dê uma olhada no operador '??', certo?

Aproveitando o tópico, registrar o VS Express é "FREE"?, pelo menos foi que li no próprio VS2005, onde aparece uma informação sobre o trial, na bandeja do sistema..

Falows! Espero respostas : )

É o mesmo que o meu então. Ótimo wink.gif

Show isso da Microsoft disponibilizar ferramenta free.

Sim, é free pra quem fizer o download até novembro de 2006. Quem fizer o download depois, provavelmente terá que pagar uma taxazinha.

Depois eu vou dar uma olhada.

Aliás, todo o VS 2005 Express tá com essa promoção, por isso recomendo baixar todas as ferramentas, o VJ# 2005, VB 2005, VC++ 2005...

E o SQL Server 2005 Express não tem limite, é totalmente free mesmo laugh.gif

Presentão hein? smile.gif

Link para o comentário
Compartilhar em outros sites

  • 0

A .NET 2.0 introduziu a possibilidade de atribuir um valor nulo aos tipos que são valores (como Int32, Boolean, Double, etc.), criando os Nullable Types, utilizando o conceito de Generics. Antes, somente tipos que são referências podiam ter valores nulos (null em C# e Nothing em VB.NET), como era o caso de System.String. Fazer...

int x = null;
int b = null;
MessageBox.Show(x.ToString());
MessageBox.Show(b.ToString());
... em C# resulta em erro porque um int não pode ter um valor nulo. Fazer...
Dim x As Integer = Nothing
Dim b As Boolean = Nothing
MessageBox.Show(x.ToString())
MessageBox.Show(b.ToString())
... em VB.NET não resulta em erro, mas x e b passam a ter os valores padrões de seus respectivos tipos (no caso, 0 e False). Invocando um erro ou não, o caso é que não temos como definir um valor nulo para estes tipos. Já para uma string isso é valido...
string s = null;
MessageBox.Show(s.ToString());
... e vai resultar em um erro na segunda linha, já que o objeto é nulo. Com os Nullable Types passou a ser possível atribuir um valor nulo à qualquer tipo que é um valor. Por isso pode-se fazer: C#
int? valor;
VB.NET
Dim valor As Nullable(Of Integer)
Com a possibilidade de atribuir-se um valor nulo a um tipo valor é importante que se possa *testar* se um objeto tem um valor ou não (ou seja, se é nulo). Um caso comum seria atribuir um Nullable Type a um tipo comum:
int valor2 = valor;
Note que "valor2" não é nullable, mas "valor" pode ser (no exemplo acima, consideremos que é). A atribuição acima então estaria errada e deveria ser feita da seguinte maneira:
int valor2 = valor ?? 0;
Ou seja, se "valor" for nulo, então será retornado "0". Caso contrário, será retornado o valor de "valor". Em VB.NET, se não me engano, isso pode ser feito assim:
Dim valor2 As Integer = Iif(valor.HasValue, valor, 0)

Certo? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Hum... entendo. Então '??' testa se a variável é nula, certo? Por exemplo:

object x;
x = null;
x = x ?? 123456;
Text = x.ToString();
No caso acima, Text, propriedade do formulário, teria o valor "123456", já que x é 'null'... Também testei 'int? x', igual ao seu exemplo.. interessante. Mas deixa eu tirar uma dúvida:
int y;
No caso acima, o valor inicial de y é 'null'? Ah! E mais uma coisa, invés de usar '??', teria o mesmo efeito:
object x;
x = null;
if(x == null) {x = 123456;}
Text = x.ToString();

Certo?

Mas, mudando de assunto, tenho algumas dúvidas sobre os operadores Bit-Shift:

P. 4 >> 1 é igual a 2, certo? Pois, 100 (4 em binário) >> 1 é 010, em decimal 2, certo, né? Mas e se acontecer o seguinte: 6 em binário é 110, correto? 110 >> 1 vai ser 55 em decimal, por que? Não teria que ser o próprio 6? E mais uma: Em 2 >> 1 o resultado é 1 (10 -> 01), certo? Mas e se eu quise-se deslocar o 0 do 10 (2 em bin.) para direita para eu obter 4 (= 100, certo?). Seria 2 >> 2?

Mas, mudando de assunto, novamente, pergunto, já que o assunto é operadores: No C#, qual operador é equivalente ao 'TypeOf...Is' do VB6? rolleyes.gif

Valews!

Link para o comentário
Compartilhar em outros sites

  • 0

Vou tentar responder e ver se eu entendi blink.gif

Hum... entendo. Então '??' testa se a variável é nula, certo?"

Sim, seria uma parte da função dela, pelo que entendi.

int y;
No caso acima, o valor inicial de y é 'null'?
Não, eu acho que não. Não foi assinalado nenhum valor para y. Veja:
public class Teste
{
    static void Main()
    {
        int x = null;
        System.Console.WriteLine("x = {0}", x);
        System.Console.Read();
        return;
    }
}
Você vai ter erro de compilação porque não pode designar null para x, tem que usar o operador ?, como explicou o Graymalkin. Teria que fazer:
public class Teste
{
    static void Main()
    {
        int? x = null;
        System.Console.WriteLine("x = {0}", x);
        System.Console.Read();
        return;
    }
}
Pra usar um Nullable type do tipo int. Aí sim x teria valor nulo. Note que apenas "int y;" não assinala um valor para ele, apenas é uma instrução para reservar um espaço de 32 bits na memória para "y", mas esse espaço ainda não guarda nada. Null, de fato, é um valor. Ou seja, o que quero dizer é que na minha opinião é possível ver que há diferença entre null e nada.
Ah! E mais uma coisa, invés de usar '??', teria o mesmo efeito:
object x;
x = null;
if(x == null) {x = 123456;}
Text = x.ToString();
Certo?
Usar ?? tem o mesmo efeito que usar:
object x;
x = null;
if (x == null) { x = 123456; }
else { x = x; }

Certo? wink.gif

E eu acho que object não é um tipo de valor, mas de referência, portanto para assinalar valor nulo para ele você não precisa do recurso de nullable types. Mas é claro que o operador ?? simplifica bastante as coisas.

Sobre o resto, prefiro deixar de responder, pois não tenho certeza, vou dar uma olhada...

Link para o comentário
Compartilhar em outros sites

  • 0

Opa, agora vi que o que eu disse não é bem verdade. Parei pra pensar sobre o fato de todos os tipos em C# serem objetos, o que muda o que eu disse sobre...

Note que apenas "int y;" não assinala um valor para ele, apenas é uma instrução para reservar um espaço de 32 bits na memória para "y", mas esse espaço ainda não guarda nada. Null, de fato, é um valor. Ou seja, o que quero dizer é que na minha opinião é possível ver que há diferença entre null e nada.

"int y;" não guarda valor na memória para y. Guardaria se fosse "int y = new int()"

Aí sim os 32 bits estariam "guardados" para y. Acontece que sendo um objeto, a memória de y não é alocada logo na simples declaração, pois este precisa ser inicializado. Aí você pode fazer de duas formas.

int y = new int(); // aloca 32 bits para y e o inicializa com o valor 0
ou
int y = 12; /* aqui você está usando uma 'short form' do que seria int y = new int();
y = 12; -> o que você também pode fazer */

Null então é valor ou não é? Sei lá laugh.gif

É, eles até tentam fazer com que não nos preocupemos com administração de memória, mas está nas nossas veias ph34r.giftongue.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Hum... entendo. Então '??' testa se a variável é nula, certo? Por exemplo:

object x;
x = null;
x = x ?? 123456;
Text = x.ToString();
No caso acima, Text, propriedade do formulário, teria o valor "123456", já que x é 'null'... Também testei 'int? x', igual ao seu exemplo.. interessante. Mas deixa eu tirar uma dúvida:
int y;
No caso acima, o valor inicial de y é 'null'? Ah! E mais uma coisa, invés de usar '??', teria o mesmo efeito:
object x;
x = null;
if(x == null) {x = 123456;}
Text = x.ToString();

Certo?

Até aqui o Rodrigo já explicou no outro post. smile.gif Então, vou explicar o restante.

Mas, mudando de assunto, tenho algumas dúvidas sobre os operadores Bit-Shift:

P.  4 >> 1 é igual a 2, certo? Pois, 100 (4 em binário) >> 1 é 010, em decimal 2, certo, né?

Exatamente.

Mas e se acontecer o seguinte: 6 em binário é 110, correto? 110 >> 1 vai ser 55 em decimal, por que?

Porque 110 é um valor decimal (cento e dez) e não um valor binário (um um zero). Portanto, 110 (cento e dez) vai ser 1101110 em binário. E deslocando-os para a direita (>>) você terá 0110111, que é justamente 55 em decimal.

Não teria que ser o próprio 6?

Não, conforme o que eu disse acima. No caso, 6 >> 1 é 3. Isso porque deslocar os bits para a direita resultará em 011, que é 3 em decimal.

E mais uma: Em 2 >> 1 o resultado é 1 (10 -> 01), certo?

Exato.

Mas e se eu quise-se deslocar o 0 do 10 (2 em bin.) para direita para eu obter 4 (= 100, certo?). Seria 2 >> 2?

Não, no caso seria 2 << 1. Ou seja, você estaria deslocando todos os bits uma posição para a esquerda e a nova posição seria preenchida com 0. Acho que no outro post eu falei como se deslocasse apenas o primeiro bit, mas são todos eles que são deslocados. Por isso, é que você deve ter feito confusão.

Mas, mudando de assunto, novamente, pergunto, já que o assunto é operadores: No C#, qual operador é equivalente ao 'TypeOf...Is' do VB6?  rolleyes.gif

Você pode utilizar só o operador "is", mas vai ser meio redundante (o próprio compilador vai te avisar isso). Para obter um comportamento semelhante ao do TypeOf você pode utilizar o método GetType() que todo objeto possui.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
Opa, agora vi que o que eu disse não é bem verdade. Parei pra pensar sobre o fato de todos os tipos em C# serem objetos, o que muda o que eu disse sobre...

Note que apenas "int y;" não assinala um valor para ele, apenas é uma instrução para reservar um espaço de 32 bits na memória para "y", mas esse espaço ainda não guarda nada. Null, de fato, é um valor. Ou seja, o que quero dizer é que na minha opinião é possível ver que há diferença entre null e nada.

"int y;" não guarda valor na memória para y. Guardaria se fosse "int y = new int()"

Aí sim os 32 bits estariam "guardados" para y. Acontece que sendo um objeto, a memória de y não é alocada logo na simples declaração, pois este precisa ser inicializado. Aí você pode fazer de duas formas.

int y = new int(); // aloca 32 bits para y e o inicializa com o valor 0
ou
int y = 12; /* aqui você está usando uma 'short form' do que seria int y = new int();
y = 12; -> o que você também pode fazer */
Null então é valor ou não é? Sei lá laugh.gif É, eles até tentam fazer com que não nos preocupemos com administração de memória, mas está nas nossas veias ph34r.giftongue.gif
Fazer...
int x;
Console.Write(x);
... vai resultar em erro porque não foi atribuído um valor para "x". Mas ele não é nulo, porque C# dá um erro de compilação, ou seja, você nem vai chegar a executar o programa. E, nesse caso, o VB.NET tem um comportamento diferente:
Dim x As Integer
Console.Write(x.ToString())

Vai ser mostrado o valor 0, porque o valor padrão de um inteiro não inicializado.

Certo? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Então é certo eu dizer que null e nada são coisas diferentes.

Null chegaria a ser um valor, né?

Existe uma sutil diferença entre não ter um valor e ter o valor nulo. Um objeto int declarado ao qual não foi atribuído valor algum, não poderá ser utilizado, uma vez que é o valor que define o objeto. Essa é a diferença entre um tipo valor e um tipo referência. Ou seja, o próprio valor (10, true, 2.3, etc.) é o objeto. A prova disso é você conseguir fazer algo do tipo...

Console.Write((2).ToString());
... onde eu estou chamando o método ToString() do objeto-valor inteiro 2. Já um tipo referência é um objeto mais complexo e que não pode ser representado por apenas um valor. Por isso ele é alocado em uma parte qualquer da memória e é feita apenas uma referência a ele. Neste caso sim, essa referência pode ou não ser nula. Concluí-se então que null não é um valor, por três principais motivos. Primeiro que é uma palavra-chave (keyword) da própria linguagem, designando algo nulo. Segundo que não dá pra fazer o que fizemos com o 2 acima...
Console.Write(null.ToString());

... e terceiro porque se ela designa algo nulo, então ela não é um objeto (até porque todo objeto descende de System.Object e tem pelo menos o método GetType()).

Certo? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Sim, estruturas são tipos valor. Não sei se você já reparou, mas System.Int32 é uma struct, já System.String é uma classe. De fato, a diferença entre uma estrutura e uma classe é justamente que o objetos da primeira são "valores" e objetos da segunda são "referências". Nem me lembrei disso (de que estruturas também são objetos complexos) quando falei "já um tipo referência é um objeto mais complexo e que não pode ser representado por apenas um valor". Mea culpa! smile.gif

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Sim, estruturas são tipos valor. Não sei se você já reparou, mas System.Int32 é uma struct, já System.String é uma classe. De fato, a diferença entre uma estrutura e uma classe é justamente que o objetos da primeira são "valores" e objetos da segunda são "referências".

Ham, se num tinha reparado, tá reparado agora laugh.gif

Nem me lembrei disso (de que estruturas também são objetos complexos) quando falei "já um tipo referência é um objeto mais complexo e que não pode ser representado por apenas um valor".

Tudo bem.

Mea culpa!

Hahaha sem problemas laugh.gif

Rodrigo.

Link para o comentário
Compartilhar em outros sites

  • 0

Mas Graymalkin, 'System.String' é referência, certo? Como posso fazer: 'System.Console.Write((" Teste ").Trim())'? Isso não é válido só para dados por 'valor', como você explica logo acima, segundo minha interpretação...

Aguardo respostas : )

Link para o comentário
Compartilhar em outros sites

  • 0

Mas Graymalkin, 'System.String' é referência, certo? Como posso fazer: 'System.Console.Write((" Teste ").Trim())'? Isso não é válido só para dados por 'valor', como você explica logo acima, segundo minha interpretação...

Aguardo respostas : )

Isso porque criou-se um atalho que foge a regra. Como strings são *muito* utilizadas, seria muito chato ter que ficar fazendo...

string s1 = new String(new char[] {'G', 'r', 'a', 'y', 'm', 'a', 'l', 'k', 'i', 'n'});
... onde poderia-se fazer apenas:
string s1 = "Graymalkin";

Vale notar que somente strings é que possuem esse "atalho", devendo todos os demais tipos referência serem inicializados com o operador new.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...