239: m=n+++n---n;
00401047 mov eax,dword ptr [ebp-4](1)
0040104A mov dword ptr [ebp-8],eax(2)
0040104D mov ecx,dword ptr [ebp-4](3)
00401050 sub ecx,1 (4)
00401053 mov dword ptr [ebp-4],ecx (5)
00401056 mov edx,dword ptr [ebp-4] (6)
00401059 add edx,1 (7)
0040105C mov dword ptr [ebp-4],edx (8)
从上面可以看出来(1)(2)是计算m=n+n-n的,(4)(5)(6)是计算n--的,(6)(7)(8)是计算n++的,这也符合++、--是从右到左的运算规则。
m=(n++)+(n--)-n;
0040102F mov eax,dword ptr [ebp-4]
00401032 mov dword ptr [ebp-8],eax
00401035 mov ecx,dword ptr [ebp-4]
00401038 sub ecx,1
0040103B mov dword ptr [ebp-4],ecx
0040103E mov edx,dword ptr [ebp-4]
00401041 add edx,1
00401044 mov dword ptr [ebp-4],edx
两者对比下就知道了,加了两个括号是等价的
#include
main()
{
//int k; (该句被注释掉了)
for(int k=0;k<3;k++)
{
static int x=3; //这个语句是否只在第一次循环中运行?(仅在本次循环中运行)
printf("%d",x++);
}
printf("\n");
for(int k=0;k<3;k++)(该句出错,已定义过一个k的变量,应改为for(k=0;k<3;k++),k从定义开始在整个main函数中有效)
{
static int x; //这个语句是否只在第一次循环中运行?(仅在本次循环中运行,且x默认值为0)
x=3; //这里是不是每次循环都起作用,为什么?(c语言语句执行时,在main函数中从上而下依次执行,因此该句共执行3次)
printf("%d",x++);
}
两者相当;
n=1;n+++n---n=(n++)+(n--)-n=1+1-1;
因为n++,n--是在该句(定义int k; k=n+++n---n;)执行后执行,n的值才改变
static 是初始化~注意初始化和赋值是不一样的~~
赋值语句重复执行多次`在一个程序中,而变量只初始化一次.
而static静态变量作用域是可以覆盖到每个块的.(可以把每次的循环体看做一个小块)
//static int x;是不是就相当于static int x=0;
//还有一问题:n=1;n+++n---n为什么是1?这不是与(n++)+(n--)-n一样吗?
这个虑一遍过程.读到第一个操作数n,继续读右面操作符,最先组成操作符的为一个操作符~~那么一个'+'就是一个操作符,后面的++是前自增.后面的以此类推.
不过这种问题不必过于纠缠.现实中代码写成这样的人,不是脑障碍就是脑残疾
你的补充问题我来回答下:
static定义的全局变量在没有赋值时默认是0 正确
下面一个问题建议你查:算术符号优先级