一直想知道赋值语句直接放在if中它到底是个什么意思?
教科书上都说什么左值,但左值具体是什么一直还没个确定的说法
看看下面这段程序:
int b=0;
004113AE mov dword ptr [b],0
int a=0;
004113B5 mov dword ptr [a],0
if(a=1)
004113BC mov dword ptr [a],1
004113C3 cmp dword ptr [a],0
004113C7 je wmain+42h (4113D2h)
{
b=1;
004113C9 mov dword ptr [b],1
}
else
004113D0 jmp wmain+49h (4113D9h)
{
b=2;
004113D2 mov dword ptr [b],2
}
注意这一行 004113C3 cmp dword ptr [a],0
明显这就是那个的关键,它是直接用a的地址里的值来和0做比较,就是把左边的a地址里的值作为if中的判断条件
int a=0;
int b=1;
printf("%d--%d/n",a=a+b,a=2);
看看这段代码
结果是这样的
3--3
这是怎么回事呢 "a=2" 这个就可以用上面说法来解释,它返回的是一个左值,就是返回了a
int a=0;
004113AE mov dword ptr [a],0
int b=1;
004113B5 mov dword ptr [b],1
printf("%d--%d/n",a=a+b,a=2);
004113BC mov dword ptr [a],2
004113C3 mov eax,dword ptr [a]
004113C6 add eax,dword ptr [b]
004113C9 mov dword ptr [a],eax
004113CC mov esi,esp
004113CE mov ecx,dword ptr [a]
004113D1 push ecx
004113D2 mov edx,dword ptr [a]
004113D5 push edx
004113D6 push offset string "%s--%s/n" (4156A4h)
004113DB call dword ptr [__imp__printf (4182BCh)]
004113E1 add esp,0Ch
004113E4 cmp esi,esp
004113E6 call @ILT+310(__RTC_CheckEsp) (41113Bh)
注意看
004113CE mov ecx,dword ptr [a]
004113D1 push ecx
004113D2 mov edx,dword ptr [a]
004113D5 push edx
就是直接把a的值直接压栈,两个参数是一样的,就是说传递的就是a,
同时这也说明了这样写是很危险的,在计算过程中对a的任何改变,都可能影响到所有参数a;
int a=0;
int b=1;
printf("%d--%d/n",a=a+b,a);
这个和上面的效果基本是相同的。
综上所诉,if(a=表达式)判断的就是a的值,而不是有些人认为的 就是判断这个赋值操作的成功与否。