在C語言橫行的時代,爲了加快運行速度,一些關鍵變量會被放入寄存器中,程序代碼請求編譯器把變量存入寄存器,然而C語言版的寄存器變量沒法經過地址得到register變量。
c++仍然支持關鍵字register
#include "iostream" #include<string> using namespace std; void main() { for (int i = 0; i < 10000; i++) { printf("%d\n", i);//這種狀況下就會把i放入寄存器,由於i被頻繁使用 } system("pause"); }
#include "iostream" #include<string> using namespace std; void main() { register string a = "陳培昌"; printf("變量地址爲%d\n", &a); system("pause"); }
輸出結果:ios
#include "iostream" #include<string> using namespace std; void main() { string a; string a = "陳培昌"; printf("教練姓名%s\n", a); system("pause"); }
所謂變量檢測的加強就是c++不容許重複聲明變量,而C能夠(不過windows下vs2013報錯,由於c/c++一直在避免這種二義性)c++
C語言中,struct結構是一組變量的集合,不認爲它是一種新的類型,說的通俗點windows
#include<stdio.h> struct mycoach { char name[100]; int age; }; void main() { struct mycoach cpc;//不加struct關鍵字報錯 }
C++中數據結構
struct mycoach { string name; int age; }; void main() { mycoach cpc;//竟然能夠 system("pause"); }
一些狀況下,struct跟類有殊途同歸之妙函數
#include "iostream" #include<string> using namespace std; struct mycoach { public: string name; int age; private: string favorite; }; void main() { mycoach cpc; system("pause"); }
#include "iostream" #include<string> using namespace std; void main() { bool w=true; printf("布爾變量長度%d\n", sizeof(w)); w = -9; printf("布爾值爲%d\n", w); w = 8; printf("布爾值爲%d\n", w); w = 0; printf("布爾值爲%d\n", w); system("pause"); }
若是多個布爾值同時聲明,可能佔用一個bit,取決於編譯器的實現spa
bool b2,b3,b4;3d
C語言中,表達式的返回值放到了CPU寄存器裏面,是一個值(數),而c++返回的是變量的自己
c++指針
void main() { int a = 20; int b = 10; (a < b ? a : b) = 30;//至關於執行b=30; printf("值b爲:%d\n", b); system("pause"); }
然而c語言中code
究其緣由是C語言返回了b的值,因此(a<b?a:b)=30最後執行的命令是10=30;這樣一來操做就變得毫無心義;聽說這個例子是說明C和c++編譯器不一樣的有力案例blog
c++如何作到的?看來是返回了地址......,因此c語言的代碼不妨修改以下:
#include<stdio.h> void main() { int a = 20; int b = 10; *(a < b?&a :&b) = 30; printf("值b爲:%d\n", b); system("pause"); }
輸出結果:
#include<iostream> using namespace std; struct mycoach { string name; int age; }; int opcoach01(mycoach* const pt) { //指針變量自己不能被修改 pt->name = "陳培昌"; pt = NULL; } int opcoach02(const mycoach *pt) { //指針指向的內存空間不能被修改 pt->name = "陳培昌"; }
輸出結果:
#include<stdio.h> void main() { const int a = 20; a = 30; printf("值a爲:%d\n", a); system("pause"); }
輸出結果:
然而:
#include<stdio.h> void main() { const int a = 20; int *p = NULL; p =&a; *p = 30; printf("值a爲:%d\n", a); getchar(); }
這樣一來:
所以在c語言中const是個僞常量;而c++沒法這樣修改,由於c++編譯器掃描到const類型時,並不像c語言那樣爲其分配內存,而是放入符號表(一種鍵值對類型的數據結構)
有別於C語言內存四區
c++編譯器掃描到對常量取地址操做時,爲常量分配內存空間
或者const變量做爲一種全局變量使用時,也會分配內存空間
c++ const類型實現機制
取值時,從符號表裏讀取a對應的變量
執行 p=int(*)&a操做時,另開闢了一塊空間,讓整型指針p指向這塊空間的地址
下列代碼證明p指向的空間存在
#include<iostream> using namespace std; void main() { const int a = 30; int *p = NULL; p = (int*)&a; *p = 40; printf("a的值依舊是:%d\n",a); cout << "p指向的空間真實存在,其內存地址是" << p << "值是:" << *p<<endl; system("pause"); }
輸出結果: