• Source
    1. #include <stdio.h>
    2. #include <limits.h>
    3. struct undefined_int {int undefined, value;};
    4. struct undefined_int f(int *a, int n) {
    5. int i;
    6. struct undefined_int min[2] = {{!0, INT_MIN}, {!0, INT_MIN}};
    7. if (!a && n < 2) return min[1];
    8. for (i = 0; i < n; i++)
    9. if (min[0].undefined || a[i] < min[0].value)
    10. min[1] = min[0], min[0] = (struct undefined_int){0, a[i]};
    11. else if (a[i] != min[0].value && (min[1].undefined || a[i] < min[1].value))
    12. min[1] = (struct undefined_int){0, a[i]};
    13. return min[1];
    14. }
    15. void g(int *a, int n) {
    16. int i;
    17. struct undefined_int x = f(a, n);
    18. printf("[");
    19. for (i = 0; i < n; i++)
    20. printf(i == 0 ? "%d" : ", %d", a[i]);
    21. if (x.undefined)
    22. printf("] -> (undefined)\n");
    23. else
    24. printf("] -> %d\n", x.value);
    25. }
    26. int main() {
    27. struct {int *a, n;} args[] = {
    28. {(int []){4, 5, 1, 7, 1, 2, 8, 9, 2, 7}, 10}
    29. , {(int []){1, 1, 1}, 3}
    30. , {(int []){1}, 1}
    31. , {(int []){}, 0}
    32. , {(int []){INT_MIN, INT_MIN}, 2}
    33. , {(int []){INT_MIN, INT_MIN + 1}, 2}
    34. , {0, 0}
    35. }, *a;
    36. for (a = args; a->a; a++) g(a->a, a->n);
    37. return 0;
    38. }
    39.