常德网站建设 天维,代理app推广,网站建设投标书范本,网站可以给pdf做笔记前言
在学习了C语言的基础上#xff0c;C到底和C有什么区别呢#xff1f;
1.1 第一个C程序
#include iostream// 使用名为std的命名空间
using namespace std;int main()
{// printf (hello world\n);// cout 标准输出 往屏幕打印内容 相当于C语言的…前言
在学习了C语言的基础上C到底和C有什么区别呢
1.1 第一个C程序
#include iostream// 使用名为std的命名空间
using namespace std;int main()
{// printf (hello world\n);// cout 标准输出 往屏幕打印内容 相当于C语言的 printf// 左移操作符在这里它的功能被改造代表数据流向// 代表数据从右端移到左端 右端是 hello world字符串左端是 cout 标准输出// 所以 cout hello world 代表将内容打印到标准输出// endl 代表换行相当于 C语言的 \n// 操作符可以连着使用cout Hello World! endl;return 0;
}
运行结果
1.2 命名空间
1.2.1 为什么引入命名空间
命名空间将全局作用域分成不同的部分不同命名空间中的标识符可以同名而不会发生冲突命名空间可以相互嵌套全局作用域也叫默认命名空间
1.2.2 怎么使用命名空间
1命名空间的定义
namespace 是C中的关键字用来定义一个命名空间语法格式为
namespace name {变量函数类
}name是命名空间的名字它里面可以包含变量、函数、类、typedef、#define 等最后由{ }包围
例如 定义一个命名空间名字叫NameSpaceA
namespace NameSpaceA
{int a 0;
}命名空间的定义可以嵌套例如
namespace NameSpaceB
{int a 1;namespace NameSpaceC{struct Teacher{char name[10];int age;};}
}2命名空间的使用
使用域解析符 :: ::是一个新符号称为域解析操作符在C中用来指明要使用的命名空间。
NameSpaceA::a 10; // 使用命名空间 NameSpaceA中的变量a
NameSpaceB::a 20; // 使用命名空间 NameSpaceB中的变量aprintf (%d, %d\n, NameSpaceA::a, NameSpaceB::a);使用命名空间B中的命名空间C中的结构体 Teacher
NameSpaceB::NameSpaceC::Teacher t2 {xiaoming, 20};使用using声明 在这里用using声明了 NameSpaceA::a 它的意思是在声明以后的程序中如果出现未指明命名空间的a就使用NameSpaceA命名空间里的a如果要使用NameSpaceB命名空间中的a则仍需要使用这样的方式 NameSpaceB::a;
using NameSpaceA::a;
a 20; // 使用命名空间NameSpaceA中的a
NameSpaceB::a 30; // 使用命名空间NameSpaceB中的ausing 声明不仅可以针对命名空间中的变量或者函数还可以对整个命名空间进行声明这样的方式声明命名空间以后在后面使用未指定具体命名空间的变量或者函数产生命名冲突的时候默认使用 NameSpaceB中的变量和函数。
using namespace NameSpaceB;
a 10;printf (%d\n, NameSpaceB::a);示例代码
#include iostreamnamespace A
{int a 1;void print(){std::cout this is namespace A std::endl; //::作用域限定符}
}namespace B
{int a 2;void print(){std::cout this is namespace B std::endl;}
}int main()
{//std::cout a std::endl; //a不是全局变量也不是main函数局部变量 所以未定义std::cout A::a std::endl;using namespace B;std::cout a std::endl;print();A::print();//using namespace A;// 这里如果不注释掉编译不通过print();return 0;
} 1.3 register关键字的变化
register关键字请求“编译器”将局部变量存储于寄存器中C语言中无法取得register变量地址在C中依然支持register关键字 1、C编译器有自己的优化方式不使用register也可能做优化 2、C中可以取得register变量的地址C编译器发现程序中需要取register变量的地址时register对变量的声明变得无效。
#include stdio.hint main()
{register int i 0; //声明寄存器变量 不能取地址for (i 0; i 1000; i);i; //C 对寄存器变量取地址 register 关键字变得无效return 0;
}1.4 变量检测加强
在C语言中重复定义多个全局变量是合法的这些同名的全局变量最终都会被链接全局数据区的同一个地址空间上在C中不允许定义多个同名的全局变量
#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;
}1.5 struct类型加强
C语言的struct定义了一组变量的集合C编译器并不认为这是一种新的类型C中的struct是一个新类型的定义声明
#include stdio.hstruct Student
{char name[20];int age;
};int main()
{// C语言中 struct 定义了一组数据的集合而不是一种新的数据类型// 所以在定义变量的时候需要在前面加上 struct 关键字进行修饰// C中 struct 定义了一种新的数据类型可以直接用来定义变量Student stu1 {xiaoming, 10};return 0;
}1.6 C中所有变量和函数都必须要有类型
1.6.1 C语言中函数的一些不好的使用方式
1 函数可以没有返回参数类型2 函数参数可以没有数据类型3 没有参数的函数可以接收任意个参数
#include stdio.h
// 1 函数可以没有返回参数类型
f()
{printf (hello world\n);
}// 2 函数参数可以没有数据类型
g(i)
{return i;
}int main()
{// 3 没有参数的函数可以接收任意个参数f(1,2,3,4,5);g(12,15);return 0;
}1.6.2 C中的加强 在C语言中 int f( )表示返回值为int接受任意参数的函数 int f(void)表示返回值为int的无参函数 在C中 int f( );和int f(void)具有相同的意义都表示返回值为int的无参函数 C更加强调类型任意的程序元素都必须显示指明类型
1.7 新增bool类型关键字
C在C语言的基本类型系统之上增加了boolC中的bool可取的值只有true和false理论上bool只占用一个字节如果多个bool变量定义在一起可能会各占一个bit这取决于编译器的实现true代表真值编译器内部用1来表示false代表非真值编译器内部用0来表bool类型只有true非0和false0两个值C编译器会在赋值时将非0值转换为true0值转换为false
#include iostreamusing namespace std;int main()
{bool a true;bool b false;a 100;cout a endl;// 输出1cout b endl;// 输出0return 0;
}1.8 三目运算符的增强 C语言返回变量的值 C语言是返回变量本身 1C语言中的三目运算符返回的是变量值不能作为左值使用 2C中的三目运算符可直接返回变量本身因此可以出现在程序的任何地方 注意三目运算符可能返回的值中如果有一个是常量值则不能作为左值使用 (a b ? 1 : b ) 30; C语言如何支持类似C的特性呢 当左值的条件要有内存空间C编译器帮助程序员取了一个地址而已
#include stdio.h// C语言中表达式的结果 放在什么地方 寄存器
// 1
// 表达式返回的是一个值是一个数
// 在C中表达式返回的是变量本身// 2 如何做到的
// 让表达式返回一个内存空间..内存的首地址 指针
// 在C语言中如何实现C的效果// 3 本质
// C编译器自己做了取地址的操作
int main()
{int a 10;int b 20;// C中三目运算符返回的是变量本身所以可以作为左值使用// 这里C语言会报错20 10c可以b 100)(a b ? a : b) 90; // 在C语言中让三目运算符可以当左值使用可以通过返回变量地址实现*(a b ? a : b) 90;printf (%d, %d\n, a, b);return 0;
}