我找到了很多有关静态的文章(MSDN,MSDN 2,Stack Overflow等等),但是我仍然不明白为什么此代码返回-1:
class Program
{
    static int value = 0;
    static int foo()
    {
        value = value - 7;
        return 1;
    }
    static void Main(string[] args)
    {
        value -= foo();
        Console.WriteLine(value);
        Console.ReadKey();
    }
}
这是调试器在foo()运行后但从中减去结果之前显示的内容value:
但是,下一步value是-1:
我希望-8因为静态字段存储在内存中一次。
当我将其更改为
var x = foo();
value -= x;
表明 -8
究竟如何运作?
将此主题视为以下主题的续篇:
上一部分
未定义的行为和序列点
让我们重新审视这个有趣而复杂的表达(斜体短语取自上述主题*smile*):
i += ++i;
我们说这会调用undefined-behavior.我假定说这个的时候,我们隐含假设型的i是内置的类型之一.
如果什么类型的i是用户定义类型?比如它的类型是Index在本文后面定义的(见下文).它还会调用未定义的行为吗?
如果是,为什么?它不等同于写作i.operator+=(i.operator++());甚至语法上更简单   i.add(i.inc());吗?或者,他们是否也调用未定义的行为?
如果不是,为什么不呢?毕竟,对象在连续的序列点之间i被修改两次.请回想一下经验法则:表达式只能在连续的"序列点"之间修改一个对象的值.如果   i += ++i是表达式,那么它必须调用未定义的行为.如果是,那么它的等价物i.operator+=(i.operator++());也   i.add(i.inc());必须调用undefined-behavior似乎是不真实的!(据我所知)
或者,i += ++i不是一个开头的表达?如果是这样,那么它是什么以及表达式的定义是什么?
如果它是一个表达式,并在同一时间,其行为也是定义良好的,那么就意味着与表达相关序列点的数量在某种程度上取决于该类型的参与表达操作数.我是否正确(甚至部分)?
顺便问一下,这个表达怎么样?
//Consider two cases:
//1. If a is an array of a built-in type
//2. If a is user-defined type which overloads the …假设这样的情况:
int a = (--t)*(t-2);
int b = (t/=a)+t;
在C和C++中,这是未定义的行为,如下所述:未定义的行为和序列点
但是,这种情况如何:
我正在修复一个Javascript - > C++端口,现在很多地方都没有注意到它.我想知道其他语言通常如何处理这个问题...保留命令undefined以某种方式特定于C和C++,不是吗?
请使用以下C代码(K&R第77页):
push(pop() - pop()); /* WRONG */
书中说,自从-和/是不可交换的运营商,其中2个顺序pop功能进行评估是必要的(显然,以获得正确的结果)......这样的话你必须首先把第一函数的结果的变量然后继续算术,如下:
op2 = pop();
push(op2 - pop());
显然这是因为编译器无法保证评估函数的顺序(...为什么?)
我的问题是,C#做同样的事吗?在使用C#时,我是否需要担心这种事情?就此而言,任何其他更高级别的语言?
可能重复:
C#中的行为和评估顺序
我有一些代码
static void Main(string[] args)
{
    int j = 0;
    for (int i = 0; i < 10; i++) 
        j = j++;
    Console.WriteLine(j);
}
为什么答案是0?