今天同事在运行capl脚本时遇到一个问题,由于脚本内容太多,我把问题点写成了demo,大概是这样
脚本如下
void func1()
{
int i = 3;
write("i value: %d", i);
i++;
}
on key 'y'
{
func1();
func1();
func1();
}
当我在CANoe上点击按键y调用三次func1()函数时,在write窗口打印的结果如下
你会发现当我第一次调用func1()时,i的值为3,第二次调用值为4,第三次调用值为5
按道理来说,每一次调用func1(),都会先声明一个变量,然后初始化为3,紧接着就打印它的值,然后才会给这个变量加1
那么其实第二次调用func1()时声明的变量i并不是第一次调用时的变量i,虽然它们在func1()内部名称是i,但是它只限于在func1()内部使用,当函数func1()执行完毕时,这个函数内的所有的局部变量应该都释放了才对
既然第二次调用时第一次的变量i都释放了,而且第二次的变量i和第一次的根本不是同一个,那为什么打印出的值会是第一次调用函数结束时的值?
变量i又不是一个全局变量,如果是一个全局变量,还能说得通
然后我又写了一个demo来对比
void func1()
{
int i;
i = 3;
write("i value: %d", i);
i++;
}
on key 'y'
{
func1();
func1();
func1();
}
看看打印的结果
这才符合我们的预期
为什么这两种写法会有不同的结果呢?
int i = 3;
int i;
i = 3;
我询问了vector的技术人员,他们给的答复是
但是这种说法并不能令我信服,所以我又在capl上试了下
def func1():
i = 1
print(i)
i = i + 1
def func2():
func1()
func1()
func2()
打印的结果为
对嘛,这才是我们想要的结果
那为什么capl中会出现这个问题,我又继续追问vector的技术支持
得到的答复是
但是我还是觉得第二次调用时的变量i和第一次调用时的变量i,虽然变量名相同,但是它们并不能看作是同一个变量
所以,就这样吧,以后用的时候还是不要声明时赋值比较好