Что будет оценивать следующий код? - PullRequest
1 голос
/ 20 сентября 2010

У меня был следующий код в тесте. Я не понимаю, что (i, j) оценивает, читая об операторе ",", я обнаружил, что он просто оценивает переменные или функции, но что он здесь делает?

main()
{
    int i = 10, j = 20;

    j = i ? (i, j) ? i : j : j;
    printf("%d %d", i, j);
}

Ответы [ 8 ]

4 голосов
/ 20 сентября 2010

(i,j) - это то же самое, что и j, потому что i - это просто переменная, и ее оценка не вызывает никаких побочных эффектов.

Так что в основном это просто запутывание здесь.

3 голосов
/ 20 сентября 2010

in (i,j), оператор , ничего не делает, потому что левое выражение не имеет побочных эффектов.

Таким образом, присвоение эквивалентно:

j = i? (j? i : j) : j;

А так как i и j отличны от нуля, до j = i;

2 голосов
/ 20 сентября 2010

Оператор запятой можно использовать для связывания связанных выражений вместе.Связанный с запятыми список выражений оценивается слева направо , а значение выражения крайнего справа является значением объединенного выражения.Он действует как точка последовательности .

A точка последовательности гарантирует, что все побочные эффекты предыдущих оценок будут выполнены, и никаких побочных эффектов от последующих оценок пока нетбыло выполнено.

Таким образом, любое выражение / присваивание будет завершено, и только после этого будет вычислено следующее выражение справа.

Например,

b=(a=4,a=5);

дает,

a=5
b=5

Также обратите внимание, что оператор запятой занимает последнее место в списке приоритетов операторов в C.

1 голос
/ 20 сентября 2010

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

i = 10; j = 20;
1) k = i,j;
2) k = (i,j);

Ответ для 1 будет 10, а для 2 будет 20. Поскольку оператор комы ничего не делает.Я надеюсь, что это прояснит больше.

1 голос
/ 20 сентября 2010

Это эквивалентно:

int main() {

    int i = 10, j = 20;

    if (i != 0) {

        (void)i; // Do nothing with i.

        if (j != 0) {

            j = i;

        } else {

            j = j; // Assign j to itself.

        }

    } else {

        j = j; // Assign j to itself.

    }

    printf("%d %d", j);

}
1 голос
/ 20 сентября 2010

Будет напечатано:

10 10

Это потому, что вы можете разбить выражение так:

j = i?((i, j)? i: j): j;

Оператор запятой вычисляется до последнего выражения, поэтому (i, j) == j.Это ненулевое значение, поэтому выражение центра оценивается как i.«i», отличное от нуля, внешнее выражение оценивается как i, поэтому j присваивается значение i.

0 голосов
/ 20 сентября 2010
main()
{
    int i = 10, j = 20; // i=10, j=20

    j = i ? /*if i */ ( (i, j) ? /* if j (1) */ i : /* else */ j ) : /* else */ j; // Added parenthesis and see (2)

    printf("%d %d", i, j); // Will therefore print 10 10
}
  1. эквивалентно if(j), поскольку (i,j) оценивается как j, поскольку i не имеет побочного эффекта.
  2. все if оцениваются как true, потому что i и j являются целыми числами и не равны нулю
0 голосов
/ 20 сентября 2010

Это на самом деле не делает ничего. Он оценивает выражение i, отбрасывает результат, оценивает выражение j и возвращает результат.

Поскольку оценка выражения i не имеет побочных эффектов, (i,j) имеет то же значение, что и просто j.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...