4

C#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 11;
            int b = 2;
            a -= b -= a -= b += b -= a;
            System.Console.WriteLine(a);
        }
    }
}

出力:27

C ++:

#include "stdafx.h"
#include<iostream>

int _tmain(int argc, _TCHAR* argv[])
{
       int a = 11;
       int b = 2;
       a -= b -= a -= b += b -= a;
       std::cout<<a<<std::endl;
       return 0;
}

出力:76

同じコードの出力が異なりますが、なぜそうなのか誰かにわかりますか?感謝します!

4

1 に答える 1

14

C#では、コードは明確に定義されており、次のようになります。

a = a - (b = b - (a = a - (b = b + (b = b - a))));

変数が再割り当てされる前に割り当てられた値が使用されることはないため、ここでは最も内側の割り当ては関係ありません。このコードには同じ効果があります。

a = a - (b = b - (a - (b + (b - a))));

これは、ほぼ同じです。

a = a - (b = (b * 3) - (a * 2));

またはさらに簡単:

b = (b * 3) - (a * 2);
a -= b;

ただし、C ++では、コードは未定義の動作を示します。それが何をするかについては全く保証がありません。

于 2012-06-06T06:12:42.830 に答える