實用性加強:
int main()
{// C語言中的變量都必須在作用域開始的位置定義!!// C++中更強調語言的“實用性”,所有的變量都可以在需要使用時再定義。for (int i = 0; i < 10; i++){std::cout << i << std::endl;}return 0;
}
register關鍵字的變化:
register關鍵字請求“編譯器”將局部變量存儲于寄存器中
C語言中無法取得register變量地址在C++中依然支持register關鍵字
1、C++編譯器有自己的優化方式,不使用register也可能做優化
2、C++中可以取得register變量的地址C++編譯器發現程序中需要取register變量的地址時,register對變量的聲明變得無效。早期C語言編譯器不會對代碼進行優化,因此register變量是一個很好的補充。#include <stdio.h>int main4_1()
{// 申請寄存器變量register int a = 10;// 在C++中 如果對一個寄存器變量進行取地址操作,該變量將被改回普通變量// register定義將會失效printf ("&a = %p, a = %d\n", &a, a);return 0;
}
變量檢測加強:
#include <stdio.h>// 在C語言中重復定義多個全局變量是合法的
// 這些同名的全局變量最終都會被鏈接全局數據區的同一個地址空間上
int g_a;
int g_a = 1;int main()
{printf ("%d\n", g_a);printf ("%p\n", &g_a);return 0;
}在C語言中只有一個全局作用域
C語言中所有的全局標識符共享同一個作用域
標識符之間可能發生沖突 在C++中不允許定義多個同名的全局變量
struct類型加強:
C語言的struct定義了一組變量的集合,C編譯器并不認為這是一種新的類型
C++中的struct是一個新類型的定義聲明#include <stdio.h>struct Student
{char name[20];int age;void print(){printf ("id = %d, name = %s\n", id, name);}
};int main()
{// C語言中 struct 定義了一組數據的集合,而不是一種新的數據類型// 所以在定義變量的時候需要在前面加上 struct 關鍵字進行修飾// C++中 struct 定義了一種新的數據類型,可以直接用來定義變量Student stu1 = {"xiaoming", 10};// 2、結構體中可以放函數stu.print();printf ("size = %d\n", sizeof(Student));return 0;
}
函數參數:
#include <stdio.h>// 如果一個函數沒有參數,C++認為這是一個無參函數,不能給函數傳參
void func()
{printf ("hello world\n");
}// C語言中一個無參函數定義是用void進行填充
void func1(void) // 等價于 func1()
{}// C++中函數參數必須要有類型
void func2(int a)
{printf ("%d\n", a);
}int main1_1()
{func();// func(1.2,4,5,"adasd");// func1(1,2.3);// func2(3.2);return 0;
}
新增bool類型:
C++中的布爾類型C++在C語言的基本類型系統之上增加了boolC++中的bool可取的值只有true和false理論上bool只占用一個字節,如果多個bool變量定義在一起,可能會各占一個bit,這取決于編譯器的實現true代表真值,編譯器內部用1來表示false代表非真值,編譯器內部用0來表示bool類型只有true(非0)和false(0)兩個值C++編譯器會在賦值時將非0值轉換為true,0值轉換為false#include <stdio.h>int main2_3()
{bool b = true;if (b) // 判斷是否為真{}if (!b) // 判斷是否為假{} float f = 0.0000000000001;if (f + 0.000001 > 0 && f - 0.000001 < 0) // 與0進行比較{}return 0;
}// bool類型:值有2中,true 和 false true 的值 是1 false 值是 0
// 用 0 來表示 false, 非0 表示 true
int main2_2()
{bool b = false;int a = 0;b = a - 1;b++;b = -100;printf ("%d\n", b);return 0;
}int main2_1()
{printf ("%d\n", true);printf ("%d\n", false);return 0;
}
三目運算符:
#include <stdio.h>// C語言中表達式的結果 放在什么地方? ==> 寄存器
// 表達式返回的是一個值,是一個數
// 在C++中,表達式返回的是變量本身// 2 如何做到的
// 讓表達式返回一個內存空間..內存的首地址 指針
// 在C語言中如何實現C++的效果// 3 本質
// C++編譯器自己做了取地址的操作
int main()
{int a = 10;int b = 20;// C++中三目運算符返回的是變量本身,所以可以作為左值使用(a > b ? a : b) = 90;// 在C語言中讓三目運算符可以當左值使用,可以通過返回變量地址實現*(a > b ? &a : &b) = 90;printf ("%d, %d\n", a, b);return 0;
}
1)C語言返回變量的值 C++語言是返回變量本身C語言中的三目運算符返回的是變量值,不能作為左值使用C++中的三目運算符可直接返回變量本身,因此可以出現在程序的任何地方2)注意:三目運算符可能返回的值中如果有一個是常量值,則不能作為左值使用(a < b ? 1 : b )= 30;3)C語言如何支持類似C++的特性呢?
====>當左值的條件:要有內存空間;C++編譯器幫助程序員取了一個地址而已