zoukankan      html  css  js  c++  java
  • C到C++的升级

    • const 在C中只是个“只读变量”,并不是真正意义上的常量,通过指针能改变它,如下
    1. 1 #include<stdio.h>
      2 int main()
      3 {
      4 const int a=0;//声明只读变量a为0
      5 int* p=(int*)&a;//给个指针指向a的空间
      6 *p=100;//改变a的存储空间的内容
      7 printf("a=%d",a);//a被更改为100
      8 return0;
      9 }

    • const在C++中是真正意义上的常量,无法通过指针来改变
    1.  1 #include<iostream>
       2 usingnamespace std;
       3 int main()
       4 {
       5 const int a=0;//声明只读变量a为0
       6 int* p=(int*)&a;//给个指针指向a的空间
       7 *p=100;
       8 cout<<a;
       9 return0;
      10 }

     
    即使分配了空间也不会用存储空间里面的内容,只会使用符号表的值。
     
    再举个例子:
    1 constint a=10;
    2 constint b=20;
    3 int c[a+b];
    上面的代码在C中会报错“无法确定数组长度”,因为在C中const只是个只读变量,本质上还是变量,有存储空间,定义数组长度用变量当然会出错了。
    但在C++中却可以编译通过,因为C++对const做了加强,使得const是真正意义上的常量。
     
     
    • const和#define的区别
    #define只是在编译前(预处理)进行普通的文本替换,没有作用域检查!
    1.  1 #include<iostream>
       2 usingnamespace std;
       3 int f(){
       4 cout<<B<<endl;
       5 }
       6 int g(){
       7 #define N 3//只希望在这个函数中用N=3
       8 constint a=100;// 希望在这个函数中用 a=100
       9 }
      10 #define B 1
      11 int main()
      12 {
      13 cout<<N<<endl;
      14 f();
      15 return0;
      16 }

    这个代码第4行会出错“[Error] 'B' was not declared in this scope”,B没有定义,说明#define编译前进行简单文本替换时,只替换#define 下面的所有,位于#define上面的则没有替换。
     
    const 则由编译器处理,有作用域检查和类型检查
    1.  1 #include<iostream>
       2 usingnamespace std;
       3 int f(){
       4 constint a=100;//只希望a=100的作用域在f()中
       5 }
       6 }
       7 int main()
       8 {
       9 cout<<a<<endl;//出错,没有定义a,因为a作用域只在f()中
      10 return0;
      11 }

    #define可以用 #undef 限定作用域,不过有点麻烦:
    1. 1 int g(){
      2 #define
      3 int a=10;
      4 #undef
      5 }
     
    • C++对函数类型和参数的加强
     
     
     
    • C++中三目运算可以返回变量(前提是a,b不能是常量!(a<b?1:5)=50;这个一看就是错的),而C中则不行(三目运算符(a<b ?a :b)  先判断问号左边是否为真,若为真执行a,否则执行b)
    如:
    1. 1 int main()
      2 {
      3 int a=1;
      4 int b=100;
      5 (a<b?a:b)=50;
      6 printf("%d %d",a,b);
      7 }
     
    但C中上述代码会出错,三目运算符不能返回变量。
     
     
     
     
  • 相关阅读:
    一本通1331后缀表达式的值
    一本通1198 逆波兰表达式
    一本通1311 求逆序对(归并排序应用)
    快速排序
    一本通1310 车厢重组(冒泡排序,类似逆序对)
    一本通1186 出现次数超过一半的数(类似桶排序)
    一本通1216 红与黑 (代码没有参考任何博客,完全是自己写的,我搜索出山了!!!)
    一本通1222 放苹果
    一本通 1212 LETTERS
    一本通1215 迷宫
  • 原文地址:https://www.cnblogs.com/juner/p/5488598.html
Copyright © 2011-2022 走看看