局部变量作用域和生存周期

// 将局部变量定义放于函数里面的起始处 (提前定义)

void fun(void)   
{
    char tmp = 0;
     if(1){
          tmp = 1;
     }
}

// 将局部变量定义放于函数里面的if下面的作用域中(就近定义)

void fun(void)   
{
     if(1){
          char tmp = 0;
          tmp = 1;
     }
}

问题:按我个人以前的使用规范习惯于使用就近定义并使用局部变量,但是今天又导师和我说,需要将局部变量放于函数起始处定义,那这样做的原因是什么?
我的观点就近定义优点:1.便于阅读 2.不满足if条件的情况下,局部变量tmp不会分配内存,减少入栈出栈次数。

将局部变量放于函数起始处定义主要是为了方便后续使用和阅读方便,不然你两个循环要定义两次局部变量

首先作为C语言来说,就要求变量在函数开始前先定义。你可以试试.c文件。如果在具体代码中间定义变量,编译是报错的
其次就是一个习惯和风格问题。作为一个函数,其实也会分成多个更小的代码块,对于影响整个代码的局部变量,可以在函数开头定义,如果只影响局部的,也可以在局部的开头定义。

你示例的代码要看tmp的作用范围,如果只在if里,那么可以在if里定义,如果影响到if外部,那么放在if里是不行的。

将局部变量放在函数起始处定义,之所以有这个要求,是因为C语言要求:变量必须在函数开始的地方声明。如果在后面使用的地方声明,编译器会报错。
但是在C++中是没有这个要求的,你可以在需要的地方声明变量。

这样做的好处有:
1.如果你代码很长,需要多次使用一个临时变量,比如反复的将字符串转int,或者for循环里使用i这种,那么可以减少定义次数,等于减少内存开销,不需要反复定义销毁对象。尤其是你在for循环体里面定义一个对象的时候。
2.如果你使用的变量很多,那么总是在用之前定义,可能会产生变量重名问题,统一定义可以一眼看清所有下面将用到的变量,不容易发生重名
3.有些时候你在if里给一个变量赋值,但在if外面要使用它的值,就造成值为空,定义在最前使用起来就比较灵活,不需要反复修改定义的位置

你的观点是对的,我个人没有找到其他更好的解释了

  1. 方便阅读
  2. 兼容更多编译器