vakito
11-05-2007 10:48
Как себя занять? Правильно, читаем башорг.
Задача.
i=5;
i = ++i+ ++i;
i=?

Ява выдает 13, С++ 14, камрад Xirax говорит, что php выдает 13.
Вопрос: почему разный результат?
это [ кто знает? ]
Комментарии:
Камрад
Zanokra
так. 13 в яве, 14 в сях, если j = ++i+ ++i

11-05-2007 21:27
не_как_все
vakito Только разобраться потом невозможно, но работает!
а если неправильно?

11-05-2007 21:27
не_как_все
vakito так. 13 в яве, 14 в сях, если j = ++i+ ++i
значит моя логика написана на яве)

я киборг

Камрад
Zanokra
а если неправильно?
ну автор кода разберется

11-05-2007 21:32
Камрад
vakito
так. 13 в яве, 14 в сях, если j = ++i+ ++i
Буду настаивать, что не 14, а от 12 до 14

11-05-2007 21:37

Камрад
Anafay
ну я без выпендрежей имею в виду

11-05-2007 21:43
Камрад
vakito
Оно так и будет. Когда пишешь, то думаешь о том, что должно получиться в итоге. А тут итог - 12, 13 и 14. По стандарту иначе не выходит.

Камрад
Anafay
порадовало:
Writing ++i + ++i could start launch missiles, or something, who knows?

12-05-2007 01:32
Камрад
"Не насилуйте язык попытками его причудливого использования." (c)Дейтел&Дейтел // Как программировать на C++

12-05-2007 01:38
Камрад
Или вот совсем простое:
{
int i = 0;
i = i++;
}

{
int i = 0;
i = ++i;
}

Что будет в первом случае, и что во втором?

12-05-2007 02:39
не_как_все
sentaus не определено в обоих случаях, да? или только в первом?

пошла читать про sequence point...

отредактировано: 12-05-2007 04:39 - Zanokra


Камрад
sentaus
да таже фигня, зависящая от компилятора.

12-05-2007 19:15
Камрад
В C/C++ Undefined в обоих случаях. Но, если я не ошибаюсь, во втором случае получится всегда 1 - вне зависимости от порядка действий. По хорошему на таких вещах нужно в error падать, даже не в warning.

Камрад
sentaus
ну да, во втором так или иначе единица

13-05-2007 00:24
Камрад
Можно продолжить извраты

#include <iostream>
#include <cstdlib>

using namespace std;


void first()
{
int i = 5;
i = ++i + ++i;
printf("1:i=%d\n", i);
}


int myinc(int &i)
{
return ++i;
}

void second()
{
int i = 5;
i = ++i + ++i;
printf("1:i=%d\n", i);
i = 5;
i=myinc(i)+myinc(i);
printf("2:i=%d\n", i);
}



int main(int argc, char *argv[])
{
printf("Fisrt\n");
first();
printf("Second\n");
second();
return EXIT_SUCCESS;
}

Компилируем в gcc -O0 и получаем:
Fisrt
1:i=14
Second
1:i=13
2:i=13

13-05-2007 00:26
не_как_все
ну да, во втором так или иначе единица
а в первом нет? сначала присваивается 0, потом увеличивается на один..

Камрад
Zanokra
в первом нет. Может сначала присвоиться ноль, а потом увеличивается i на 1. Но присвоенный ноль сохраняется. Плюсы справа.

13-05-2007 05:28
не_как_все
vakito потом увеличивается i на 1. Но присвоенный ноль сохраняется
как так?

13-05-2007 11:05
Камрад
Я ещё выше привел программу, где компилятор в двух местах компилирует одинаковый код различными способами.

отредактировано: 13-05-2007 14:02 - sentaus


Ваш комментарий:
Гость []
[смайлики сайта]
Автоматическое распознавание URL
Не преобразовывать смайлики
Cкрыть комментарий
Закрыть