首页 > 代码库 > C中的一些不足

C中的一些不足

1、对于register关键字

示例:

(1)、C程序:

#include<stdio.h>

int main(void){
    register int a = 10; 

    printf("&a = %p\n", &a);
    return 0; 
}

运行结果:

技术分享

(2)、C++程序:

#include<iostream>
#include<stdio.h>
using namespace std;

int main(void){
    register int a = 10; 

    printf("&a = %p\n", &a);
    return 0;
}

运行结果:

技术分享

C语言中register(寄存器存储变量),不能对这个所修饰的变量进行取地址;

C++中可以对register修饰的变量进行取地址,因为C++编译器内部做好了优化处理;


2、变量可以重复定义

代码如下:

#include<stdio.h>

int g_a;   //在这里变量都已经定义了
int g_a = 100;
int main(void){
    printf("%d\n", g_a);
    return 0;
}

运行结果:

技术分享

C编译器检查不严格,可以这样重复定义变量。


3、对于函数的返回值和函数的参数

代码如下:

#include<stdio.h>

//C++编译器是非常严格的
f(i){   
    printf("%d\n", i); 
}

g(){    //C语言的编译器是不严格的(存在默认类型);
    return 5;
}

int main(void){
    f(‘A‘);

    printf("%d\n", g(1, 2, 3, 4, 5, 6));
    return 0;
}

运行结果:

技术分享

C语言对于函数的参数和返回值的要求不是那么的严格意义上的。


4、三目运算符

代码如下:

#include<stdio.h>

int main(void){
    int a = 10; 
    int b = 20; 
    //在C语言中,表达式的结果,存放在寄存器
    //在C语言中,表达式返回的是变量的值
    //(a < b ? a : b)  (里面返回的是常量,常量不能&)  = 30;
    //10 = 30;
    //返回的是一段连续的空间即可,即一段内存的首地址;
    *(a < b ? &a : &b) = 30;   //C++编译器对C++语言的优化,内部就是这样实现的;

    printf("a = %d, b = %d\n", a, b); 
    return 0;

}

运行结果:

技术分享

在C语言中,三目运算符的返回时一个值,不是一段连续的内存空间,所以对其不能进行赋值操作!


5、对于C语言中的const

示例:

(1)、代码如下:

#include<stdio.h>

typedef int* TYPE; 

int main(void){
    //TYPE const a;
    const TYPE a;
    int b = 10; 
    int c = 20; 

    a = &b; 
    a = &c; 

    return 0;
}

运行结果:

技术分享

原因分析:类比法,const int a; <===>  int const a;  Type的数据类型是:int *

此时的情况是:const Type a; <===> Type const a;  此时可以说明的是:const修饰的是指针变量的值,是常量,不能更改,而这个指针所指向空间的值是可以改变的。

(2)、代码如下:

#include<stdio.h>

int main(void){

    //C语言中的const是一个冒牌货
    const int a = 10;//只读变量,在内存中分配空间
    int *p = (int *)&a;

    *p = 20; //间接赋值
    printf("a = %d\n", a); 
}

运行结果:

技术分享

在C语言中,const修饰的是一个冒牌货,叫做只读变量,不是真正意义上的常量,可以通过指针间接赋值对其修改!

在C++中的情况,代码如下:

#include<stdio.h>
#include<iostream>
using namespace std;

int main(void){
    const int a = 10; //符号表,键值对的存储
    int *p = (int *)&a;//&,此时另外分配了内存空间,时机:编译器在编译期间;
    
    //C++语言中const是一个真正的常量
    *p = 20; //间接赋值
    printf("a = %d\n", a); 
}

运行结果:

技术分享

C++中的const所修饰的是真正的常量,在对其进行&运算时,将会开辟另外的内存空间。



本文出自 “wait0804” 博客,请务必保留此出处http://wait0804.blog.51cto.com/11586096/1875512

C中的一些不足