Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在一条语句中取消引用和前进指针?_C#_Operator Precedence_Unsafe Pointers - Fatal编程技术网

C# 在一条语句中取消引用和前进指针?

C# 在一条语句中取消引用和前进指针?,c#,operator-precedence,unsafe-pointers,C#,Operator Precedence,Unsafe Pointers,我从字节数组中读取如下内容: int* i = (int*)p; id = *i; i++; 如果我错了,请纠正我,但是++的优先级高于*,因此可以在同一语句中组合*I和I++吗?(例如*i++) (这在技术上是不安全的,C,而不是C++,P是字节*) 我相信 id = *i; i++; 及 它们是等价的 ++运算符用作后缀时(例如i++),返回增量之前的变量值 我有点被反射镜的输出搞糊涂了 unsafe class Test { static public void Test1(

我从字节数组中读取如下内容:

int* i = (int*)p;
id = *i;
i++;
如果我错了,请纠正我,但是++的优先级高于*,因此可以在同一语句中组合*I和I++吗?(例如*i++)

(这在技术上是不安全的,C,而不是C++,P是字节*)

我相信

id = *i;
i++;

它们是等价的

++
运算符用作后缀时(例如
i++
),返回增量之前的变量值


我有点被反射镜的输出搞糊涂了

unsafe class Test
{
    static public void Test1(int p, out int id)
    {
        int* i = (int*)(p);
        id = *i;
        i++;
    }

    static public void Test2(int p, out int id)
    {
        int* i = (int*)(p);
        id = *i++;
    }
}
结果是

public static unsafe void Test1(int p, out int id)
{
    int* i = (int*) p;
    id = i[0];
    i++;
}

这显然是不相等的。

我相信

id = *i;
i++;

它们是等价的

++
运算符用作后缀时(例如
i++
),返回增量之前的变量值


我有点被反射镜的输出搞糊涂了

unsafe class Test
{
    static public void Test1(int p, out int id)
    {
        int* i = (int*)(p);
        id = *i;
        i++;
    }

    static public void Test2(int p, out int id)
    {
        int* i = (int*)(p);
        id = *i++;
    }
}
结果是

public static unsafe void Test1(int p, out int id)
{
    int* i = (int*) p;
    id = i[0];
    i++;
}

这显然是不等价的。

id=*i++

我会做你想做的

++在取消引用后修改指针

编辑: 正如Eric指出的,根据规范,++在取消引用后不会发生。i++递增i并返回其初始值,因此规范定义的行为是在取消引用之前递增。id=*i++的可见行为与您查看取消引用之前或之后发生的增量时相同。

id=*i++

我会做你想做的

++在取消引用后修改指针

编辑:
正如Eric指出的,根据规范,++在取消引用后不会发生。i++递增i并返回其初始值,因此规范定义的行为是在取消引用之前递增。id=*i++的可见行为与您查看取消引用之前或之后发生的增量时相同。

是,但请不要查看。您的代码非常容易阅读、理解、修改和调试*i++不是上面提到的任何一个,因为为了理解它是指(*i)++还是*(i++),你需要正确地记住优先规则。这很公平,我必须同意。仅仅因为它是可以做到的,并不意味着它应该做到:)在C/C++中写*i++是惯用的,但在C#中肯定不是这样。是的,但请不要。您的代码非常容易阅读、理解、修改和调试*i++不是上面提到的任何一个,因为为了理解它是指(*i)++还是*(i++),你需要正确地记住优先规则。这很公平,我必须同意。仅仅因为它是可以做到的,并不意味着它应该做到:)在C/C++中写*i++是惯用的,但在C#中肯定不是这样。实际上,在写这句话时你必须非常小心。在取消引用之后,指针似乎被修改了,但事实并非如此!记住,“之后”意味着时间上有一系列事件。这是性格建设工作的确切顺序的事件在时间上是这个案件。当您这样做时,您将看到实际上变量修改发生在取消引用之前。而且:MSDN在“优先级和求值顺序”中明确指出,优先级较高的运算符在优先级较低的运算符之前求值。因此,计算顺序不取决于编译器、优化器或运算符重载的一时兴起,而是由语言严格定义的。先递增,然后取消引用,但使用旧指针值。当你这样做的时候,它会变得有点复杂:a=*i+++2**i++。这可以被看作是一行意大利面,但定义很明确:)事实上,你在说这句话时必须非常小心。在取消引用之后,指针似乎被修改了,但事实并非如此!记住,“之后”意味着时间上有一系列事件。这是性格建设工作的确切顺序的事件在时间上是这个案件。当您这样做时,您将看到实际上变量修改发生在取消引用之前。而且:MSDN在“优先级和求值顺序”中明确指出,优先级较高的运算符在优先级较低的运算符之前求值。因此,计算顺序不取决于编译器、优化器或运算符重载的一时兴起,而是由语言严格定义的。先递增,然后取消引用,但使用旧指针值。当你这样做的时候,它会变得有点复杂:a=*i+++2**i++。这可以看作是一行意大利面,但定义很明确:)