@aviare
Новосибирский первокурсник-программист.

Тернарный оператор ведёт себя странно в Си. В чём в проблема?

Решил немножко поиграться с циклом for и тернарным условным оператором.
Программа должна в массиве случайно заданных чисел найти минимум и максимум. Однако, мало того, что она плохо ищет, так ещё и переменная либо min, либо max, принимают очень большое или очень маленькое значение (например, 1590569472 или -688611888)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
#define RANDMAX 100

int main()
{
    srand (time(NULL));
    int a[N], i, max, min;
    for (i = 0, a[N]; i < N; printf ("%3d", a[++i] = rand()%RANDMAX));
    for (max = a[0], i = 1; i < N; (max = (max < a[i]) ? a[i]: max), i++);
    for (min = a[0], i = 1; i < N; (min = (min > a[i]) ? a[i]: min), i++);
    printf ("\n Max: %d\n Min: %d\n", max, min);
    return 0;
}

Использую ubuntu 14.04, gcc 4.8.
Примеры того, что получаю при запуске программы.
dima@trustme:~/amaproga$ ./stih
 28 88 78 72 69 35 11  3 45 92
 Max: 88
 Min: -542684176
dima@trustme:~/amaproga$ ./stih
  9 23 14 80  3  4 20 48 30 42
 Max: 1213853936
 Min: 3
dima@trustme:~/amaproga$ ./stih
 68 46 77 71 51 82 62 66 55 55
 Max: 1436604496
 Min: 46
dima@trustme:~/amaproga$ ./stih
 31 55 60 31 94 26 26 37 65 11
 Max: 94
 Min: -1571974768
dima@trustme:~/amaproga$ ./stih
 31 55 60 31 94 26 26 37 65 11
 Max: 94
 Min: -1921410176
dima@trustme:~/amaproga$ ./stih
 37 51 51 96 23 89 31  2 53  3
 Max: 96
 Min: -1506582624

Объясните, пожалуйста, в чём проблема. И, если возможно, подскажите как исправить. Заранее спасибо.
  • Вопрос задан
  • 227 просмотров
Решения вопроса 1
opium
@opium
Просто люблю качественно работать
вы при инициализации используете ++i,
в итоге a[0] не инициализирован и состоит из мусора,
так еще и в конце выходите за границы массива
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Evsign
Выходите за границы массивов, т.к. условия стоят в хедере цикла. На последней итерации происходит обращение к 10й ячейке (у вас только 0..9 элементов), а только потом идёт проверка условия и выход из цикла.
Ответ написан
KorsaR-ZN
@KorsaR-ZN
Все у Вас верно, достаточно заменить только ++i на i++

Единственное, что плохой стиль программирования у Вас.
Не делайте так, не пытайтесь сокращать синтаксис, после Вас еще люди могут читать.
Компилятору будет совершено без разницы напишите Вы так или полный аналог через нормальный цикл и полноценный IF, а Ваша программа от этого станет понятной, легко читаемой и поддерживаемой.

P.S про различие ++i и i++, почитайте в google, сразу станет понятно в чем была Ваша ошибка.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы