Re[4]: if (x = 0 || x++)
От: Андрей Тарасевич Беларусь  
Дата: 25.02.05 18:22
Оценка:
Здравствуйте, Rosigma, Вы писали:

АТ>>С практической точки зрения, если забыть про неопределенное поведение, никто не гарантирует, что постинкретмент 'x' будет произведен до присваивания 'x' нового значения. Если постинкремент будет произведен после присвивания, то финальное знечение 'x' будет '1'. Если до — то '0'. Финальный 'printf', может напечатать как '0', так и '1'.


R>Если постинкремент реализован посредством преинкремента,


???

R>то постинкретмент 'x' будет произведен до присваивания 'x' нового значения. И результат должен быть всегда 0 и никогда 1.


Нет. Еще раз: инкремент (пост- или пре- — неважно) может быть произведен как до так и после присваивания. Это зависит от большого количества труднопредсказуемых факторов, типа установок компиляции, контекста, версии компилятора и дня недели.
Best regards,
Андрей Тарасевич
Re[8]: if (x = 0 || x++)
От: Андрей Тарасевич Беларусь  
Дата: 25.02.05 18:23
Оценка:
Здравствуйте, Rosigma, Вы писали:

R>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>и как


АТ>>
АТ>>temp = i;
АТ>>i = i + 1;
АТ>>i = v[temp];
АТ>>


R>Вот именно так и будет.


Нет, как "будет" предказать заранее невозможно. На то оно и неопределенное поведение.
Best regards,
Андрей Тарасевич
Re[5]: if (x = 0 || x++)
От: Rosigma Украина http://rosigma.com/
Дата: 25.02.05 19:43
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Нет. Еще раз: инкремент (пост- или пре- — неважно) может быть произведен как до так и после присваивания. Это зависит от большого количества труднопредсказуемых факторов, типа установок компиляции, контекста, версии компилятора и дня недели.


Тогда где именно об это можно почитать?
Roman Yakhymets, http://rosigma.com/, All inside you, ICQ #214741007
Re[9]: if (x = 0 || x++)
От: Rosigma Украина http://rosigma.com/
Дата: 26.02.05 11:22
Оценка: -1
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Здравствуйте, Rosigma, Вы писали:


R>>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>>и как


АТ>>>
АТ>>>temp = i;
АТ>>>i = i + 1;
АТ>>>i = v[temp];
АТ>>>


R>>Вот именно так и будет.


АТ>Нет, как "будет" предказать заранее невозможно. На то оно и неопределенное поведение.


Операция инкремента имеет высший приоритет, чем операция присваивания. Поэтому она должна выполняться перед операцией присваивания. И никакого здесь неопределенного поведения.
Roman Yakhymets, http://rosigma.com/, All inside you, ICQ #214741007
Re[10]: if (x = 0 || x++)
От: Андрей Тарасевич Беларусь  
Дата: 26.02.05 18:57
Оценка: +1
Здравствуйте, Rosigma, Вы писали:

АТ>>>>и как


АТ>>>>
АТ>>>>temp = i;
АТ>>>>i = i + 1;
АТ>>>>i = v[temp];
АТ>>>>


R>>>Вот именно так и будет.


АТ>>Нет, как "будет" предказать заранее невозможно. На то оно и неопределенное поведение.


R>Операция инкремента имеет высший приоритет, чем операция присваивания. Поэтому она должна выполняться перед операцией присваивания.


Во-первых, приоритеты операций не имеют никакого отношения к тому, в каком порядке они будут выполняться. Приоритеты операций задают только группировку операций в выражении.

Во-вторых, "выполнение" — несколько неконкретный термин. Операторы в выражениях в С/С++ вычисляются и при этом могут обладать еще побочными эффектами.

Вычисление оператора — 'i++' заключается в получении старого значения 'i'. И все. Сам же инкремент 'i' не является частью процесса вычисления 'i++'. Это побочный эффект 'i++'. Побочный эффект может произойти (т.е. 'i' может увеличиться на 1) в любой момент до конца вычисления данного выражения.

Вычисление выражения вида 'i = v[i]' заключается в получении значения 'v[i]' и приведении его к типу переменной 'i' (пусть 'int'). Смена значения 'i' присваиванием является побочным эффектом данного выражения и может произойти в любой момент до конца вычисления данного выражения.

Таким образом, в данном случае выполнение нашего выражения 'i = v[i++]' эквивалентно вычислению значения 'V' равного '(int) v[I]' (где 'I' — значение переменной 'i' до инкремента) и выполнению двух побочных эффектов: "занести значение 'I + 1' в переменную 'i'" и "занести значение 'A' в переменную 'i'". Языки С/С++ не дают абсолютно никаких гарантий по поводу того, в каком порядке произойдут эти побочные эффекты. Отсюда и получаются два ранее приводившихся варианта. Приоритеты операций же не имеют к этому никакого отношения.

R>И никакого здесь неопределенного поведения.


Неопределенное поведение в данном случае оговороено черным по белому в стандартах языков С и С++.
Best regards,
Андрей Тарасевич
Re[11]: if (x = 0 || x++)
От: Андрей Тарасевич Беларусь  
Дата: 27.02.05 05:42
Оценка:
АТ>Таким образом, в данном случае выполнение нашего выражения 'i = v[i++]' эквивалентно вычислению значения 'V' равного '(int) v[I]' (где 'I' — значение переменной 'i' до инкремента) и выполнению двух побочных эффектов: "занести значение 'I + 1' в переменную 'i'" и "занести значение 'A' в переменную 'i'".

Здесь опечатка. Читать: "занести значение 'V' в переменную 'i'"
Best regards,
Андрей Тарасевич
Re[3]: if (x = 0 || x++)
От: greenya Украина  
Дата: 27.02.05 15:28
Оценка:
Здравствуйте, _wind_, Вы писали:

__>Здравствуйте, _wind_, Вы писали:


__>>Здравствуйте, Аноним, Вы писали:



А>>>Именно такой код:

А>>>
А>>>#include <stdio.h>

А>>>void main()
А>>>{
А>>>    int x = 0;
А>>>    if (x = 0 || x++) 
А>>>        printf("%d\n", x);

А>>>    printf("%d\n", x);
А>>>}
А>>>

А>>>что выдаст и почему?

А>>>


__>>1



__>проверил. Выдаёт 0.

__>почему x++ не увеличивает значение икса?
__>Если первый операнд оператора || есть false, то должен выполниться и второй опреанд!


в действительности он обрабатывается и он был бы "1" если бы симолы "++" стояли бы перед иксом, а так, он выполняется после определения истинности условия..... таким образо в любом случаи должна быть выведена на экран "1".
Re[4]: if (x = 0 || x++)
От: Rosigma Украина http://rosigma.com/
Дата: 27.02.05 16:40
Оценка:
Здравствуйте, greenya, Вы писали:

G>Здравствуйте, _wind_, Вы писали:


__>>Здравствуйте, _wind_, Вы писали:


__>>>Здравствуйте, Аноним, Вы писали:



А>>>>Именно такой код:

А>>>>
А>>>>#include <stdio.h>

А>>>>void main()
А>>>>{
А>>>>    int x = 0;
А>>>>    if (x = 0 || x++) 
А>>>>        printf("%d\n", x);

А>>>>    printf("%d\n", x);
А>>>>}
А>>>>

А>>>>что выдаст и почему?

А>>>>


__>>>1



__>>проверил. Выдаёт 0.

__>>почему x++ не увеличивает значение икса?
__>>Если первый операнд оператора || есть false, то должен выполниться и второй опреанд!


G>в действительности он обрабатывается и он был бы "1" если бы симолы "++" стояли бы перед иксом, а так, он выполняется после определения истинности условия..... таким образо в любом случаи должна быть выведена на экран "1".


У кого компилятор выдает "1"???!
Roman Yakhymets, http://rosigma.com/, All inside you, ICQ #214741007
Re: if (x = 0 || x++)
От: knizov  
Дата: 27.02.05 17:31
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Именно такой код:

А>
А>#include <stdio.h>

А>void main()
А>{
А>    int x = 0;
А>    if (x = 0 || x++) 
А>        printf("%d\n", x);

А>    printf("%d\n", x);
А>}
А>

А>что выдаст и почему?

А>


Dыдаст 0, но в программе ошибка — в выражении if(...) иксу присваивается результат выражения x=(0 || x++).
Оно влюбом случае — 0.
Re[5]: if (x = 0 || x++)
От: greenya Украина  
Дата: 27.02.05 17:34
Оценка: :)
Здравствуйте, Rosigma, Вы писали:

R>Здравствуйте, greenya, Вы писали:


G>>Здравствуйте, _wind_, Вы писали:


__>>>Здравствуйте, _wind_, Вы писали:


__>>>>Здравствуйте, Аноним, Вы писали:



А>>>>>Именно такой код:

А>>>>>
А>>>>>#include <stdio.h>

А>>>>>void main()
А>>>>>{
А>>>>>    int x = 0;
А>>>>>    if (x = 0 || x++) 
А>>>>>        printf("%d\n", x);

А>>>>>    printf("%d\n", x);
А>>>>>}
А>>>>>

А>>>>>что выдаст и почему?

А>>>>>


__>>>>1



__>>>проверил. Выдаёт 0.

__>>>почему x++ не увеличивает значение икса?
__>>>Если первый операнд оператора || есть false, то должен выполниться и второй опреанд!


G>>в действительности он обрабатывается и он был бы "1" если бы симолы "++" стояли бы перед иксом, а так, он выполняется после определения истинности условия..... таким образо в любом случаи должна быть выведена на экран "1".


R>У кого компилятор выдает "1"???!


у меня компилятор в голове выдает "1"
Re[6]: if (x = 0 || x++)
От: Rosigma Украина http://rosigma.com/
Дата: 28.02.05 10:50
Оценка: :)
Здравствуйте, greenya, Вы писали:

G>Здравствуйте, Rosigma, Вы писали:


R>>У кого компилятор выдает "1"???!


G>у меня компилятор в голове выдает "1"


Пришло время сменить компилятор....
Roman Yakhymets, http://rosigma.com/, All inside you, ICQ #214741007
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.