事实证明我的想法是错误的,这是一个简单的测试程序:
代码: 全选
#include <stdio.h>
void copy(char *, char *);
int main()
{
char t[] = "Hello world!";
char s[] = "";
copy(s, t);
printf("%s\n", s);
}
void copy(char *s,char *t)
{
while (*s++ = *t++)
;
}
[/color]
这是它的汇编代码:
代码: 全选
.file "strcopy.c"
.section .rodata
.LC0:
.string ""
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $48, %esp
movl %gs:20, %eax
movl %eax, 44(%esp)
xorl %eax, %eax
movl $1819043144, 31(%esp)
movl $1870078063, 35(%esp)
movl $560229490, 39(%esp)
movb $0, 43(%esp)
movzbl .LC0, %eax
movb %al, 30(%esp)
leal 31(%esp), %eax
movl %eax, 4(%esp)
leal 30(%esp), %eax
movl %eax, (%esp)
call copy
leal 30(%esp), %eax
movl %eax, (%esp)
call puts
movl 44(%esp), %edx
xorl %gs:20, %edx
je .L3
call __stack_chk_fail
.L3:
leave
ret
.size main, .-main
.globl copy
.type copy, @function
copy:
pushl %ebp
movl %esp, %ebp
.L5:
movl 12(%ebp), %eax
movzbl (%eax), %edx
movl 8(%ebp), %eax
movb %dl, (%eax)
movl 8(%ebp), %eax
movzbl (%eax), %eax
testb %al, %al
setne %al
addl $1, 8(%ebp)
addl $1, 12(%ebp)
testb %al, %al
jne .L5
popl %ebp
ret
.size copy, .-copy
.ident "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
.section .note.GNU-stack,"",@progbits
[/color]
那么现在的问题就是:后自增比赋值的优先级要高,而表面上看上去自增却发生在赋值之后,我认为我的说法可以解释这个问题(赋值掉取的是原变量在内存中的一个副本,而变量本身已经增加了),但从汇编的代码不支持这个说法,那么怎么解释这里的优先级问题呢?哪位高手能不能举个例子展示一下后自增比赋值的优先级要高呢?