Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: @synthesize en 9 Julio 2010, 05:53 am



Título: Punto y coma
Publicado por: @synthesize en 9 Julio 2010, 05:53 am
Estudiando métodos de ordenación, em quedé en Radix. Ví el código de ejemplo que ponene en Wikipedia para implementar, hasta ahí todo bien

Ví que en varias sentencias, ponían ; en una linea, siendo el único contenido de la misma. Pensaba que es un error, así que probé a compilar, pero funciona perfectamente. ¿Alguien me dice que hace ahí ese punto y coma?

Código
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define NUMELTS 20
  5.  
  6. void radixsort(int x[], int n)
  7. {
  8.  int front[10], rear[10];
  9.  struct {
  10.    int info;
  11.    int next;
  12.  } node[NUMELTS];
  13.  int exp, first, i, j, k, p, q, y;
  14.  
  15.  /* Inicializar una lista vinculada */
  16.  for (i = 0; i < n-1; i++) {
  17.    node[i].info = x[i];
  18.    node[i].next = i+1;
  19.  } /* fin del for */
  20.  node[n-1].info = x[n-1];
  21.  node[n-1].next = -1;
  22.  first = 0; /* first es la cabeza de la lista vinculada */
  23.  for (k = 1; k < 5; k++) {
  24.    /* Suponer que tenemos números de cuatro dígitos */
  25.    for (i = 0; i < 10; i++) {
  26.      /*Inicializar colas */
  27.      rear[i] = -1;
  28.      front[i] = -1;
  29.    } /*fin del for */
  30.    /* Procesar cada elemento en la lista */
  31.    while (first != -1) {
  32.      p = first;
  33.      first = node[first].next;
  34.      y = node[p].info;
  35.      /* Extraer el kâsimo dÁgito */
  36.      exp = pow(10, k-1); /* elevar 10 a la (k-1)ésima potencia */
  37.      j = (y/exp) % 10;
  38.      /* Insertar y en queue[j] */
  39.      q = rear[j];
  40.      if (q == -1)
  41. front[j] = p;
  42.      else
  43. node[q].next = p;
  44.      rear[j] = p;
  45.    } /*fin del while */
  46.  
  47.    /* En este punto, cada registro está en su cola basándose en el dígito k
  48.        Ahora formar una lista única de todos los elementos de la cola.
  49.        Encontrar el primer elemento. */
  50.    for (j = 0; j < 10 && front[j] == -1; j++);
  51.      ;
  52.    first = front[j];
  53.  
  54.    /* Vincular las colas restantes */
  55.    while (j <= 9) { /* Verificar si se ha terminado */
  56.      /*Encontrar el elemento siguiente */
  57.      for (i = j+1; i < 10 && front[i] == -1; i++);
  58. ;
  59.      if (i <= 9) {
  60. p = i;
  61. node[rear[j]].next = front[i];
  62.      } /* fin del if */
  63.      j = i;
  64.    } /* fin del while */
  65.    node[rear[p]].next = -1;
  66.  } /* fin del for */
  67.  
  68.  /* Copiar de regreso al archivo original */
  69.  for (i = 0; i < n; i++) {
  70.    x[i] = node[first].info;
  71.    first = node[first].next;
  72.  } /*fin del for */
  73. } /* fin de radixsort*/
  74.  
  75.  
  76. int main(void)
  77. {
  78.  int x[50] = {NULL}, i;
  79.  static int n;
  80.  
  81.  printf("\nCadena de números enteros: \n");
  82.  for (n = 0;; n++)
  83.    if (!scanf("%d", &x[n])) break;
  84.  if (n)
  85.    radixsort (x, n);
  86.  for (i = 0; i < n; i++)
  87.    printf("%d ", x[i]);
  88.  return 0;
  89. }
  90.  


Título: Re: Punto y coma
Publicado por: carlitos_jajajajaja en 9 Julio 2010, 07:13 am
cuando solo hay un punto y coma quiere decir sentencia vacia, o sea que literalmente ese punto y coma no hace nada

Supongo que es cuestion del estilo del codigo, lo hace para enfatizar - separar del resto del codigo los bucles terminados en punto y coma, seguramente como una forma de decir "Notese que este bucle no tiene ninguna otra sentencia asociada"


Título: Re: Punto y coma
Publicado por: @synthesize en 9 Julio 2010, 07:17 am
En caso de ser eso que dices, es la técnica mas rara para enfatizar que he visto en mucho tiempo XD


Título: Re: Punto y coma
Publicado por: nicolas_cof en 9 Julio 2010, 08:17 am
Al margen de que a mi tambien me parece una tecnica muy oscura :P ( oscura = rara ), cabe mencionar que no afecta en nada el uso de sentencias vacias ( ; ).

Salu10.


Título: Re: Punto y coma
Publicado por: do-while en 9 Julio 2010, 10:25 am
Es lo que se ha comentado hasta ahora. La primera y unaica vez que he visto codigo de este estilo, fue algo diferente. Aqui realizan el for sin cuerpo poniendo un punto coma justo despues de la estructra de repeticion, y luego añaden fuera del cuerpo, pero indexada, una unica sentencia vacia.

Yo normalmente utilizo la primera forma (el for sin cuerpo), pero en el que vi, dejaban el for como siempre y luego añadian en el cuerpo la sentencia vacia:
Código
  1. for(... ; ... ; ...)
  2.    ; /* aqui la sentencia vacia */
  3.  

Para gustos hay colores...

¡Saludos!