/ / Скручений код C ++ [дублювати] - c ++

Скручений код C ++ [дублювати] - c ++

Можливі дублікати: Невизначена поведінка і точки послідовності

 #include< iostream.h>
int main()
{
int i=7,j=i;
j=(i++,++i,j++*i);
cout <<j;
return 0;
}

Що буде вихід C + код?

Це моя домашня робота, яку дав мені мій професор.

Відповіді:

10 за відповідь № 1

Іноді допомагає переконати людей, які не вірять, що це невизначено, фактично компілюючи програму з кількома компіляторами і спостерігаючи за результатами:

Після фіксації iostream.h помилка,

  • g ++ 4.5.2 відбитки 64
  • CLang ++ 2,8 відбитків 63
  • Sun C ++ 5.8 відбитків 63
  • MSVC 2010 відбитків 64

(Ох, і, переписані, щоб використовувати C I / O, оригінальний компілятор K&R C на принтерах Unix 7)


4 для відповіді № 2

[Відредаговано для обліку редагування запитань про OP]:

Це невизначено щодо того, яким буде вихід.


3 для відповіді № 3

У коді є такі помилки:

#include <iostream.h> має бути #include <iostream>,

j не ініціалізована, тому значення j++*i не відомо - ОК, це було виправлено в редагуванні,

Крім того, само призначення неналежне. Заплутану лінію можна переписати як:

i++;
++i;
j = j++ * i;

І остання частина є недійсною з описаних тут причин:

Невизначена поведінка і точки послідовності


-1 для відповіді № 4

По суті, ви збільшуєте i на 2, помноживши його на початкове значення j, і додавши його.

Наприкінці, j = 64

j = ((7+2)*7) + 1 = (9*7)+1 = 63+1 = 64

Принаймні, що "моє." Visual Studio 2010 компілятор робить з ним.