文章目录
C++中的变量可以在需要使用时再定义
#include <stdio.h>
int main(int argc, char *argv[])
{
int c = 0;
printf("Begin...\n");
for(int i=0; i<10; i++) //C语言编译 ERROR
//C++ 正确
{
for(int j=0; j<10; j++)
{
c += i * j;
}
}
printf("c = %d\n", c);
printf("End...\n");
printf("Press enter to continue ...");
getchar();
return 0;
}
C++关键字register变得无效
c++编译器有自己的优化方式,不使用register也可能做优化
#include <stdio.h>
int main(int argc, char *argv[])
{
register int c = 0;
printf("Begin...\n");
printf("&c = %08X\n", &c); //C语言中的寄存器地址不可取 编译ERROR
//c++正确 C++中的register变得鸡肋
printf("End...\n");
printf("Press enter to continue ...");
getchar();
return 0;
}
在C++中,不允许定义多个同名的全局变量
在C语言中,重复定义多个同名的全局变量是合法的
#include <stdio.h>
int g_var;
int g_var = 1; //C语言编译通过
//C++编译 ERROR
int main(int argc, char *argv[])
{
printf("Begin...\n");
printf("g_var = %d\n", g_var);
printf("End...\n");
printf("Press enter to continue ...");
getchar();
return 0;
}
c++中的const
#include <stdio.h>
int main(int argc, char *argv[])
{
const int c = 0;
int* p = (int*)&c;
printf("Begin...\n");
*p = 5;
printf("c = %d\n", c); //C语言 5
//C++ 0
printf("End...\n");
printf("Press enter to continue ...");
getchar();
return 0;
}
C++编译器对const常量的处理
当碰见常量声明时在符号表中放入常量
编译过程中若发现使用常量则直接以符号表中的值替换
编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间
注意:
C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。
处理过程:
C语言中的const变量
C语言中const变量是只读变量,有自己的存储空间
C++中的const常量
可能分配存储空间
当const常量为全局,并且需要在其它文件中使用(extern)
当使用&操作符取const常量的地址
实例分析 C++中的const常量
#include <stdio.h>
int main(int argc, char *argv[])
{
const int a = 1;
const int b = 2;
int array[a + b] = {0};
int i = 0;
for(i=0; i<(a+b); i++)
{
printf("array[%d] = %d\n", i, array[i]);
}
printf("Press enter to continue ...");
getchar();
return 0;
}
C编译器:
C++编译器:
分析:int array[a + b] = {0}; 证明在C++中的const是真正意义上的常量
C++中的const是真正意义上的常量
const常量和宏的区别:
C++中的const常量类似于宏定义
const int c = 5; ≈ #define c 5
const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器处理,单纯的文本替换
实例分析
#include <stdio.h>
void f()
{
#define a 3
const int b = 4;
}
void g()
{
printf("a = %d\n", a);
//printf("b = %d\n", b);
}
int main(int argc, char *argv[])
{
f();
g();
printf("Press enter to continue ...");
getchar();
return 0;
}
分析:g()中可以使用f()中的a,明显不合理
C++中struct是一种数据类型:
C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型
C++中的struct是一个新类型的定义声明
#include <stdio.h>
struct Student
{
const char* name;
int age;
};
int main(int argc, char *argv[])
{
Student s1 = {"Delphi", 30}; //C语言 ERROR struct Student s1 = {"DDD", 30};
//C++正确
Student s2 = {"Tang", 30};
printf("Press enter to continue ...");
getchar();
return 0;
}
C++是一种强类型的语言:
C++中所有的变量和函数都必须有类型
C语言中的默认类型在C++中是不合法的
C语言中的垃圾特性:
f(i)
{
printf("i = %d\n", i);
}
g()
{
return 5;
}
在C语言中
int f();表示返回值为int,接受任意参数的函数
int f(void);表示返回值为int的无参函数
在C++中
int f();和int f(void)具有相同的意义,都表示返回值为int的无参函数
三目运算符的升级:
C语言中的三目运算符返回的是变量值,不能作为左值使用
C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方
注意:
三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 1;
int b = 2;
(a < b ? a : b) = 3; //C语言 ERROR
//C++正确
printf("a = %d, b = %d\n", a, b);
printf("Press enter to continue ...");
getchar();
return 0;
}
Q:c++怎么会直接返回变量本身那?
A:引用