编程的学习,绝非一朝一夕,只有日积月累,长久的坚持学习,去编程,对我们的影响将是潜移默化的,最终技术的提升是水到渠成,让我们一起开启 Linux C/C++ 之旅.
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++编译器内部做好了优化处理。
代码如下
#include<stdio.h>
int g_a; //在这里变量都已经定义了
int g_a = 100;
int main(void){
printf("%d\n", g_a);
return 0;
}
运行结果
C编译器检查不严格,可以这样重复定义变量。
代码如下
#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语言对于函数的参数和返回值的要求不是那么的严格意义上的。
代码如下
#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语言中,三目运算符的返回时一个值,不是一段连续的内存空间,所以对其不能进行赋值操作。
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所修饰的是真正的常量,在对其进行&运算时,将会开辟另外的内存空间。
原创文章链接:C 语言中的一些不足