Можливі дублікати: Невизначена поведінка і точки послідовності
#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 компілятор робить з ним.