if (x = 0 || x++)
От: Аноним  
Дата: 22.02.05 12:36
Оценка: 17 (3) :))
Именно такой код:
#include <stdio.h>

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

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

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

Re: if (x = 0 || x++)
От: Аноним  
Дата: 22.02.05 12:40
Оценка:
Здравствуйте, Аноним, Вы писали:


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

А>
А>#include <stdio.h>

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

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

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

А>


разве не
1
1
Re: if (x = 0 || x++)
От: Аноним  
Дата: 22.02.05 12:42
Оценка:
Здравствуйте, Аноним, Вы писали:


0
Re: if (x = 0 || x++)
От: DeadAdmin Латвия http://www.livejournal.com/users/dedmazaj
Дата: 22.02.05 12:44
Оценка:
Здравствуйте, Аноним, Вы писали:


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

А>
А>#include <stdio.h>

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

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

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

А>


0
0
Re: if (x = 0 || x++)
От: kmn Украина  
Дата: 22.02.05 12:48
Оценка:
Здравствуйте, Аноним, Вы писали:


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

А>
А>#include <stdio.h>

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

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

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

А>


это равносильно:

x = 0;
bool result = x != 0;
x ++;

ASSERT (result == false);
if (result)          // этот код линковщик выкинит 
    printf(...)

ASSERT (x == 1);
printf(...);         // останется только это
Re: if (x = 0 || x++)
От: _wind_ Россия  
Дата: 22.02.05 12:50
Оценка:
Здравствуйте, Аноним, Вы писали:


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

А>
А>#include <stdio.h>

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

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

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

А>


1
С уважением,
Денис
Re: if (x = 0 || x++)
От: King Oleg Украина http://kingoleg.livejournal.com
Дата: 22.02.05 12:57
Оценка:
Здравствуйте, Аноним, Вы писали:


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

А>
А>#include <stdio.h>

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

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

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

Выдаст 1.

x = 0 — присвоится 0 , но булево значение false. Выполняем условие поcле ||.
x++ — булево значение false; значит, первый printf не выполнится.
После if x равен 1.
King Oleg
*Читайте DOC'и, они rules*
Re[2]: if (x = 0 || x++)
От: _wind_ Россия  
Дата: 22.02.05 12:58
Оценка:
Здравствуйте, _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, то должен выполниться и второй опреанд!
С уважением,
Денис
Re: if (x = 0 || x++)
От: Аноним  
Дата: 22.02.05 13:05
Оценка:
Vse ponimayu, no pochemu 0 a ne 1?
Prichem esli sdelat' ++x to togda 1, 1. Eto ponyatno. A vot x++ poluchaetsya ne updeytaet peremennuyu v sluchae esli if ne vipolnyaetsya. Esche prikol'noe povedenie:

if (x = 3 || x++) vidast 1, 1 Iz toy je opery...
Re[2]: if (x = 0 || x++)
От: DeadAdmin Латвия http://www.livejournal.com/users/dedmazaj
Дата: 22.02.05 13:06
Оценка:
> Выдаст 1.
>
> x = 0 — присвоится 0 , но булево значение false. Выполняем условие поcле ||.
> x++ — булево значение false; значит, первый printf не выполнится.
> После if x равен 1.

BCB даёт один "0"
Posted via RSDN NNTP Server 1.9
Re[2]: Po prikolu potestil v JScripte :)
От: Аноним  
Дата: 22.02.05 13:09
Оценка:
Pochti toje samoe, tol'ko dlya sluchaya if (x=3 || x++) budet ne 1, 1, A 3, 3
Re: if (x = 0 || x++)
От: Tan4ik Россия  
Дата: 22.02.05 13:11
Оценка: 45 (4) +1
Здравствуйте, Аноним, Вы писали:

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


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


выдаст просто 0, ибо
#include <stdio.h>

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

    printf("%d\n", x);
}
---
С уважением,
Лазарев Андрей
Re: if (x = 0 || x++)
От: hemmul США  
Дата: 22.02.05 13:11
Оценка: 27 (2)
Здравствуйте, Аноним, Вы писали:


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

А>
А>#include <stdio.h>

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

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

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

А>


хе-хе — 0
смотрим:
if (x = 0 || x++)

если бы это воспринималось как
if ((x = 0) || x++)

то написалось бы 1 (ибо 0 || 1 есть true) (два раза)

но! из-за различного присиденса, изначальное выражение эквивалентно:
if (x = (0 || x++))

результатом (0||x++), при начальном x=0 является false (0). сразу после "выполнения" || значение x увеличивается на 1, но затем выполняется operator=() b и икс опять обнуляется. поэтому значение в if() есть false, а x=0.
Ы

vox clamantis in deserto
Re: if (x = 0 || x++)
От: woody Украина http://woodpecker.org.ua
Дата: 22.02.05 13:21
Оценка:
Здравствуйте, Аноним, Вы писали:
[skip]
А>что выдаст и почему?
А> if (x = 0 || x++)

Если рассмотреть выражение в скобках, то получим:
[x = 0 || x++] --> [x = (0 || x++)] --> [x = (x++, 0 || 0)] --> [x = 0]

Также, я думаю, понятно почему (x = <non-zero> || x++) даст две 1.

ЗЫ Скобки как всегда рулят (для контроля над приоритетом операций)
Re[3]: if (x = 0 || x++)
От: King Oleg Украина http://kingoleg.livejournal.com
Дата: 22.02.05 13:22
Оценка:
Здравствуйте, DeadAdmin, Вы писали:

>> Выдаст 1.

>>
>> x = 0 — присвоится 0 , но булево значение false. Выполняем условие поcле ||.
>> x++ — булево значение false; значит, первый printf не выполнится.
>> После if x равен 1.

DA>BCB даёт один "0"

Я понял свою ошибку.
King Oleg
*Читайте DOC'и, они rules*
Re[2]: if (x = 0 || x++)
От: woody Украина http://woodpecker.org.ua
Дата: 22.02.05 13:25
Оценка: 5 (1)
Здравствуйте, hemmul, Вы писали:
H>если бы это воспринималось как
H>
H>if ((x = 0) || x++)
H>

H>то написалось бы 1 (ибо 0 || 1 есть true) (два раза)

Один раз, ибо x++ — постинкремент и там было бы 0 || 0 — false
Re[3]: if (x = 0 || x++)
От: hemmul США  
Дата: 22.02.05 13:29
Оценка:
Здравствуйте, woody, Вы писали:

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

H>>если бы это воспринималось как
H>>
H>>if ((x = 0) || x++)
H>>

H>>то написалось бы 1 (ибо 0 || 1 есть true) (два раза)

W>Один раз, ибо x++ — постинкремент и там было бы 0 || 0 — false


угу

vox clamantis in deserto
Re: if (x = 0 || x++)
От: BlackHeretic Израиль  
Дата: 22.02.05 13:48
Оценка:
Здравствуйте, Аноним, Вы писали:


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

А>
А>#include <stdio.h>

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

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

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

А>



Думаю что выдаст 1 и все. х станет равен 1 только после окончания вычисления логического выражения.
ICQ 156156278
Re: if (x = 0 || x++)
От: WinterMute Россия http://yarrr.ru
Дата: 22.02.05 13:59
Оценка:
Выдаст 0. Из-за коротких вычислений условий.
Re: if (x = 0 || x++)
От: Areg Россия  
Дата: 22.02.05 14:38
Оценка: +1
Здравствуйте, Аноним, Вы писали:


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

А>
А>#include <stdio.h>

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

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

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

А>


0 или 1 в зависимости в каком порядке компилятор вычислит арифметические выражения х=0 и х++.
Re: if (x = 0 || x++)
От: 0xFADE США github.com/NotImplemented
Дата: 22.02.05 15:03
Оценка: 39 (4) +4
Здравствуйте, Аноним, Вы писали:


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

А>
А>#include <stdio.h>

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

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

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

А>


Неопределенное поведение, не стоит гадать на кофейной гуще.
Re[2]: if (x = 0 || x++)
От: woody Украина http://woodpecker.org.ua
Дата: 22.02.05 15:21
Оценка: +1
Здравствуйте, Areg, Вы писали:

A>0 или 1 в зависимости в каком порядке компилятор вычислит арифметические выражения х=0 и х++.


мдя... както Joel Spolsky в одной из своих статей сказал что программисты не понимают принципы и работу с указателями в C... оказывается все намного сложнее

Ладна, http://lib.ru/CTOTOR/kernigan.txt

2.12. Старшинство и порядок вычисления

В приводимой ниже таблице сведены правила старшинства и ас-
социативности всех операций, включая и те, которые мы еще не
обсуждали. Операции, расположенные в одной строке, имеют
один и тот же уровень старшинства; строки расположены в по-
рядке убывания старшинства. Так, например, операции *, / и %
имеют одинаковый уровень старшинства, который выше, чем уро-
вень операций + и -.

OPERATOR ASSOCIATIVITY
++ RIGHT TO LEFT
|| LEFT TO RIGHT
= RIGHT TO LEFT

т.е. в начале будет вычислен x++, потом 0 || 0, и уже потом x = ...
Re[2]: if (x = 0 || x++)
От: woody Украина http://woodpecker.org.ua
Дата: 22.02.05 15:23
Оценка:
Здравствуйте, 0xFADE, Вы писали:

FAD>Неопределенное поведение, не стоит гадать на кофейной гуще.


В таком случае нужно курить спеки и приоритеты операций. Там обычно это все есть
Re[3]: if (x = 0 || x++)
От: Oyster Украина https://github.com/devoyster
Дата: 22.02.05 15:33
Оценка: -1
Здравствуйте, _wind_, Вы писали:

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



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

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

А вот и неправда Как раз если первый операнд false, то второй уже не обрабатывается. Это вам не VB!
Re[4]: if (x = 0 || x++)
От: Oyster Украина https://github.com/devoyster
Дата: 22.02.05 15:35
Оценка: +1
Здравствуйте, Oyster, Вы писали:

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


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



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

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

O>А вот и неправда Как раз если первый операнд false, то второй уже не обрабатывается. Это вам не VB!


Гоню...
Re[2]: if (x = 0 || x++)
От: xBlackCat Россия  
Дата: 22.02.05 15:43
Оценка: 4 (1)
Здравствуйте, 0xFADE, Вы писали:

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



FAD>Неопределенное поведение, не стоит гадать на кофейной гуще.


Для информации: http://www.eskimo.com/~scs/C-faq/q3.3.html
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Rojac &mdash; Rsdn Offline JAva Client
Анонсы и обсуждение здесь
Автор: xBlackCat
Дата: 08.02.10
Re[4]: if (x = 0 || x++)
От: anton_t Россия  
Дата: 22.02.05 16:04
Оценка:
Здравствуйте, Oyster, Вы писали:

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


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



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

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

O>А вот и неправда Как раз если первый операнд false, то второй уже не обрабатывается. Это вам не VB!

Как раз потому что первый операнд false будет выполнен второй операнд. Вот если бы первый был true, тогда другое дело...
Re[3]: if (x = 0 || x++)
От: Кодт Россия  
Дата: 23.02.05 03:28
Оценка:
Здравствуйте, woody, Вы писали:

FAD>>Неопределенное поведение, не стоит гадать на кофейной гуще.


W>В таком случае нужно курить спеки и приоритеты операций. Там обычно это все есть


Тут дело не в приоритете операций. Как уже сказали Tan4ik и hemmul, скобки будут расставлены однозначным образом.
(bool)(x = (0 || x++))

И, очевидно, есть одна точка следования между вычислением 0 и вычислением x++ — это фича оператора ||.
Но есть ли точка следования между x++ и x = (...) — тайна сия велика. Похоже, что нет.
Дальше — компилятор волен делать что попало, в зависимости от опций, а то и от погоды на луне (у него может просто сорвать башню на таких конструкциях).
Наиболее ожидаемые ответы — это 0 или 1 1.
Перекуём баги на фичи!
Re[4]: if (x = 0 || x++)
От: Шахтер Интернет  
Дата: 23.02.05 04:29
Оценка:
Здравствуйте, Кодт, Вы писали:

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


FAD>>>Неопределенное поведение, не стоит гадать на кофейной гуще.


W>>В таком случае нужно курить спеки и приоритеты операций. Там обычно это все есть


К>Тут дело не в приоритете операций. Как уже сказали Tan4ik и hemmul, скобки будут расставлены однозначным образом.

К>
К>(bool)(x = (0 || x++))
К>

К>И, очевидно, есть одна точка следования между вычислением 0 и вычислением x++ — это фича оператора ||.
К>Но есть ли точка следования между x++ и x = (...) — тайна сия велика. Похоже, что нет.
К>Дальше — компилятор волен делать что попало, в зависимости от опций, а то и от погоды на луне (у него может просто сорвать башню на таких конструкциях).
К>Наиболее ожидаемые ответы — это 0 или 1 1.

Из стандарта.

i = v[i++]; // the behavior is unspecified
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[5]: if (x = 0 || x++)
От: Андрей Тарасевич Беларусь  
Дата: 23.02.05 09:43
Оценка: +1
Здравствуйте, Шахтер, Вы писали:

Ш>Из стандарта.


Ш>i = v[i++]; // the behavior is unspecified


Известная опечатка стандарта. Деложно было быть 'undefined'.
Best regards,
Андрей Тарасевич
Re: if (x = 0 || x++)
От: CkuB  
Дата: 23.02.05 18:10
Оценка: -1
Здравствуйте, Аноним, Вы писали:


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

А>
А>#include <stdio.h>

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

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

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

А>


Выдаст 0, потому что:
if (x = 0 || x++) эквивалентно if ((x = 0) || (x++))
операторы выполняются последовательно,
первым выполняется (x = 0), что есть false,
если первый оператор false, то выполняется второй оператор.
Так как это постинкремент, то сначала возвращается x (т.е. 0).
Условие не выполняется и инкремент не выполняется. Что и следовало доказать
Re[2]: if (x = 0 || x++)
От: Андрей Тарасевич Беларусь  
Дата: 23.02.05 19:37
Оценка:
Здравствуйте, CkuB, Вы писали:

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

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

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

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

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

А>>


CB>Выдаст 0, потому что:

CB> if (x = 0 || x++) эквивалентно if ((x = 0) || (x++))
CB>операторы выполняются последовательно,
CB>первым выполняется (x = 0), что есть false,
CB>если первый оператор false, то выполняется второй оператор.
CB>Так как это постинкремент, то сначала возвращается x (т.е. 0).
CB>Условие не выполняется и инкремент не выполняется. Что и следовало доказать

Как уже было сказано выше, код приводит к неопределенному поведению. Не существует никакого определенного ответа на поставленный вопрос с точки зрения языков С/С++. Может напечататься все, что угодно. Может вообще ничего не напечататься.

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

Но это все гадание на кофейной гуще. Правильный ответ на копрос задачи: код порождает неопределенное поведение, поэтому ответа на вопрос о том, что он "выдаст" (и выдаст ли что-нибудь вообще), не существует.
Best regards,
Андрей Тарасевич
Re[2]: if (x = 0 || x++)
От: Кодт Россия  
Дата: 23.02.05 21:26
Оценка:
Здравствуйте, CkuB, Вы писали:

CB> if (x = 0 || x++) эквивалентно if ((x = 0) || (x++))


Не эквивалентно.
Перекуём баги на фичи!
Re[5]: if (x = 0 || x++)
От: alex_e_  
Дата: 24.02.05 09:48
Оценка:
Ш>Из стандарта.

Ш>i = v[i++]; // the behavior is unspecified


Просто любопытно, о каком стандарте идет речь?

В msdn например есть вот такое описание

var j, k;
k = 2;
j = k++;
Here, j is assigned the value 2, as the increment occurs after the expression is evaluated.

Я всегда так и считал, разве это не так, что

i = v[i++]; всеравно, что


i = v[i];
i++;

Причем мне кажется, это справедливо для любого скольугодно сложного оператора.

Т.е. для if (x = 0 || x++) { ...}
это будет if (x = 0 || x) {x++; ...} else {x++} — что-то такое.
Re[6]: if (x = 0 || x++)
От: Кодт Россия  
Дата: 24.02.05 10:15
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

Ш>>i = v[i++]; // the behavior is unspecified


АТ>Известная опечатка стандарта. Деложно было быть 'undefined'.


В общем-то, какая разница, что за un- там будет. К феерверку это может привести только на экзотических платформах, а для x86 компилятор просто нарожает какую-то непредсказуемую пачку из add, inc, mov.
При глубокой оптимизации он может вообще своим скудным умищем предсказать, по какой ветке и с какими значениями надо идти. И не факт, что предскажет правильно.
Перекуём баги на фичи!
Re[6]: if (x = 0 || x++)
От: Андрей Тарасевич Беларусь  
Дата: 25.02.05 00:21
Оценка: 5 (1) +1
Здравствуйте, alex_e_, Вы писали:

Ш>>Из стандарта.


Ш>>i = v[i++]; // the behavior is unspecified


__>Просто любопытно, о каком стандарте идет речь?


ANSI/ISO стандарте языка С++.

__>В msdn например есть вот такое описание


__>var j, k;

__>k = 2;
__>j = k++;
__>Here, j is assigned the value 2, as the increment occurs after the expression is evaluated.

Для данного частного случая приведенное в MSDN утверждение можно сичтать условно верным. Формально же и в общем случае данное утверждение не верно и правильно ситуацию с побочными эффектами не описывает. То, что к 'k' применен постникремент совсем не означает, что инкремент будет произведен после вычисления всего выражения. Постникремент означает только то, что результатом подвыражения 'k++' является исходное значение 'k'. Когда же именно произойдет постинкремент — не оговаривается. Данный код может быть странслирован также как

var temp = k;
k = k + 1;
j = temp;


и как

k = k + 1;
j = k - 1;


__>Я всегда так и считал, разве это не так, что


__>i = v[i++]; всеравно, что


__>i = v[i];

__>i++;

Нет. Если закрыть глаза на пеопределенное поведение, 'i = v[i++]' может быть странслировано и как

i = v[i];
i = i + 1;


и как

temp = i;
i = i + 1;
i = v[temp];


Результат, разумеется, получится разный.

__>Причем мне кажется, это справедливо для любого скольугодно сложного оператора.


Где-нибудь в java — да, но не в С/С++.
Best regards,
Андрей Тарасевич
Re[6]: if (x = 0 || x++)
От: Шахтер Интернет  
Дата: 25.02.05 04:33
Оценка:
Здравствуйте, alex_e_, Вы писали:

Ш>>Из стандарта.


Ш>>i = v[i++]; // the behavior is unspecified


__>Просто любопытно, о каком стандарте идет речь?


Стандарт C++.

__>В msdn например есть вот такое описание


__>var j, k;

__>k = 2;
__>j = k++;
__>Here, j is assigned the value 2, as the increment occurs after the expression is evaluated.

Это описание не вполне адекватно.

Представь себе, что j и k размещены в регистрах R1 и R2 некоторого воображаемого процессора. Тогда обе операции можно было бы выполнить одновременно одной ассемблерной инструкцией

mov R1 , R2++

В общем случае, всю вычислительную работу между двумя точками следования следует представлять себе как происходящую параллельно. Соответственно, если при этом происходит конфликт записи -- результат не определён.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: if (x = 0 || x++)
От: Rosigma Украина http://rosigma.com/
Дата: 25.02.05 17:51
Оценка:
Здравствуйте, Аноним, Вы писали:


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

А>
А>#include <stdio.h>

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

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

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

А>


0 конечно.
Roman Yakhymets, http://rosigma.com/, All inside you, ICQ #214741007
Re[7]: if (x = 0 || x++)
От: Rosigma Украина http://rosigma.com/
Дата: 25.02.05 18:02
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>и как


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


Вот именно так и будет.
Roman Yakhymets, http://rosigma.com/, All inside you, ICQ #214741007
Re[3]: if (x = 0 || x++)
От: Rosigma Украина http://rosigma.com/
Дата: 25.02.05 18:09
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

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


Если постинкремент реализован посредством преинкремента, то постинкретмент 'x' будет произведен до присваивания 'x' нового значения. И результат должен быть всегда 0 и никогда 1.
Roman Yakhymets, http://rosigma.com/, All inside you, ICQ #214741007
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...
Пока на собственное сообщение не было ответов, его можно удалить.