C++语言对C的增强(1)——实用性、变量检测、struct类型、C++中所有变量和函数都必须有类型、bool类型、三目运算符
1、“实用性”增强
C语言中的变量都必须在作用域开始的位置定义,C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义。
2、变量检测加强
在C语言中,重复定义多个同名的全局变量是合法的;在C++语言中,不允许定义多个同名的全局变量。C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上。
3、struct类型增强
C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型;
C++中的struct是一个新类型的声明。
1 #include <iostream>
2 struct Student 3 { 4 char name[100]; 5 int age; 6 }; 7 8 int main(int argc, char *argv[]) 9 { 10 struct Student s1 = { "wang1",1 }; //在C中需要struct Student s1 11 struct Student s2 = { "wang2",2 }; //在C中需要struct Student s2 12 13 return 0;
4、C++中所有变量和函数都必须有类型
C++中所有的变量和函数都必须有类型,C语言中的默认类型在C++中是不合法的;
“函数f的返回值是什么类型?”、“参数又是什么类型?”、“函数g可以接受多少个参数?”
//在C语言中,以下不报错,但是在c++中,必须定义返回值的类型和参数的类型,及确定参数个数,不能定义函数时和调用函数时的参数个数不同。 #include <stdio.h> f(i) //没有定义返回值的类型和参数的类型 { printf("i=%d\n",i); } g() //参数个数问题 { return 5; } int main() { f(10); g(1); g(1, 2, 3); return 0; }
在C语言中
int f( );表示返回值为int,接受任意参数的函数
int f(void);表示返回值为int的无参函数
在C++中
int f( );和int f(void);具有相同的意义,都表示返回值为int的无参函数
C++更加强调类型,任意的程序元素都必须显示指明类型
5、新增bool类型关键字
C++在C语言的基本类型系统之上增加了bool,C++中的bool只占用一个字节,如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现。
true代表真值,编译器内部用1来表示;false代表非真值,编译器内部用0来表示。
bool类型只有true(非0)和false(0)两个值,C++编译器会在赋值时将非0值转换成true,0值转换为false。
1 #include <iostream> 2 3 using namespace std; 4 5 int main(int argc, int *argv[]) 6 { 7 int a; 8 bool b = true; 9 printf("b=%d,sizeof(b)=%d\n", b, sizeof(b));//b=1,sizeof(b)=1 10 11 b = 4; 12 a = b; 13 printf("a=%d,b=%d\n", a, b);//a=1,b=1 14 15 b = -4; 16 a = b; 17 printf("a=%d,b=%d\n", a, b);//a=1,b=1 18 19 a = 10; 20 b = a; 21 printf("a=%d,b=%d\n", a, b);//a=10,b=1 22 23 b = 0; 24 printf("b=%d\n", b);//b=0 25 26 return 0; 27 }
6、三目运算符功能加强
1)C语言返回变量的值,C++语言是返回变量本身。C语言中的三目运算符返回的是变量值,不能作为左值使用;C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地
方
2)注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用,如:(a < b ? 1 : b )= 30;
3)C语言如何支持类似C++的特性呢?
当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已。
1 #include <iostream> 2 3 using namespace std; 4 5 int main(void) 6 { 7 int a=10; 8 int b = 20; 9 //返回一个最小值,并且给最小值赋值成30 10 //三目运算符是一个表达式,表达式不可能做左值 11 (a < b ? a : b) = 30; 12 printf("a=%d,b=%d\n", a, b); 13 14 return 0; 15 }