C++ 不但在C語言的基礎(chǔ)上進(jìn)行了很多擴(kuò)展,而且也對C語言部分做了細(xì)節(jié)上的改進(jìn),變量的定義位置就是其中之一。
C89 規(guī)定,所有局部變量都必須定義在函數(shù)開頭,在定義好變量之前不能有其他的執(zhí)行語句。C99 標(biāo)準(zhǔn)取消這這條限制,但是 VC/VS 對 C99 的支持很不積極,仍然要求變量定義在函數(shù)開頭。
C89 和 C99 是兩套不同的C語言標(biāo)準(zhǔn),C99 是 C89 的升級版,我們已在《C語言的三套標(biāo)準(zhǔn):C89、C99和C11》中進(jìn)行了講解。
請看下面的代碼:
#include <stdio.h>
int main(){
? ? int a;
? ? scanf("%d", &a);
? ? int b;
? ? scanf("%d", &b);
? ? int c = a + b;
? ? printf("%d\n", c);
? ? return 0;
}
將代碼保存到源文件main.c,那么它可以在 GCC、Xcode 下編譯通過,但在 VC/VS 下會報錯。GCC、Xcode 對 C99 的支持非常好,可以在函數(shù)的任意位置定義變量;但 VC/VS 對 C99 的支持寥寥無幾,必須在函數(shù)開頭定義好所有變量。
將上面的代碼再保存到源文件main.cpp,那么它在 GCC、Xcode、VC/VS 下都可以編譯通過。這是因?yàn)?C++ 取消了原來的限制,變量只要在使用之前定義好即可,不強(qiáng)制必須在函數(shù)開頭定義所有變量。
注意源文件的后綴,.c是C語言代碼,.cpp是C++代碼,它們的編譯方式不同。
取消限制帶來的另外一個好處是,可以在 for 循環(huán)的控制語句中定義變量,請看下面的例子:
#include <iostream>
using namespace std;
int sum(int n){
? ? int total = 0;
? ? //在for循環(huán)的條件語句內(nèi)部定義變量i
? ? for(int i=1; i<=n ;i++){
? ? ? ? total += i;
? ? }
? ? return total;
}
int main(){
? ? cout<<"Input a interge: ";
? ? int n;
? ? cin>>n;
? ? cout<<"Total: "<<sum(n)<<endl;
? ? return 0;
}
運(yùn)行結(jié)果:
Input a interge: 10
Total: 55
在 for 內(nèi)部定義循環(huán)控制變量 i,會讓代碼看起來更加緊湊,并使得 i 的作用域被限制在整個 for 循環(huán)語句內(nèi)部(包括循環(huán)條件和循環(huán)體),減小了命名沖突的概率。在以后的編碼過程中,我推薦這種寫法。