赞
踩
C++中更强调语言的实用性,所有的变量都可以在需要使用时定义。我们都知道C语言都必须要在作用域之前的位置定义,否则会报错。
引申概念,什么是作用域?
通常我们在写代码的时候,所用到的名字并不是有效/可用的,限定变量或者函数的名字的可用性的代码范围就叫作用域。全局变量作用域就是整个文件,加了extern声明之后作用域就可以为整个工程空间使用。局部变量的作用域就是本函数内,用完即丢弃。
范例:
#include <stdio.h> #include <stdlib.h> int main(void) { int c = 0; printf("Begin...\n"); for(int i=0; i < 10; i++) //在C语言中,变量定义需要在函数开始,不能在使用的地方定义。 { for(int j = 0; j < 10; j++) { c += i*j; } } printf("c = %d\n", c); printf("End...\n"); return 0; }
C++编译器也可以编译C代码,通过Dev-C++软件分别创建C工程和C++工程,C++工程可以编译pass,C工程报错如下:
注意,使用ubuntu gcc编译能编译通过,因为Dev-C++ 的C编译器和GUN gcc 编译器遵循的标准不一样。GUN gcc 对标准C进行了扩展。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
register int c = 0;
printf("Begin...\n");
printf("&c = %08X\n", &c);
printf("End...\n");
return 0;
}
说明标准C不支持对register取地址。VC++6.0有警告,但是也可以获取寄存地址,只是说明编译器对register变量有处理,申请不掉register变量就变成普通变量。但是标准C是不支持的。
#include <stdio.h>
#include <stdlib.h>
int c = 1;
int c;//加上extern 关键字,C++可以编译通过,表示在前面定义的。
int main(void)
{
printf("Begin...\n");
printf("&c = %08X\n", &c);
printf("End...\n");
return 0;
}
#include <stdio.h>
//const int c = 0;// const修饰全局变量,不可用指针操作修改值,会出现段错误。
int main(void)
{
const int c = 0;
int *p = (int*)&c;
*p = 8;
printf("c=%d\n", c);
return 0;
}
printf("c address = %08X\n", &c);
最终打印如下:
c=0
c address = EB6F729C
范例,加强const常量c和c++的理解:
#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]);
}
return 0;
}
分别用gcc 和 g++编译运行结果:
C编译器直接报错,无法确定数组array的大小,因为const在c中本质是变量,编译器无法知道数组array的大小,变量只有在运行时候才知道值。
C++编译器作为常量处理,直接到符号表中取值,所以array[a+b] 就是array[1+2].
C++中的const小结
范例:
#include <stdio.h> void f() { #define a 3 //本意是想在本函数中使用a,作用域是该函数 const int b = 4;//该变量作用域为f函数 } void g() { printf("a = %d\n", a);//但是预编译器会直接替换掉a. printf("b =d %d\n", b);//编译会报错,因为编译器会对作用域进行检查 } int main(int argc, char *argv[]) { f(); g(); return 0; }
#include <stdio.h>
struct Student
{
const char* name;
int age;
};
int main(int argc, char *argv[])
{
Student s1 = {"Tom", 30};
Student s2 = {"Tony", 28};
return 0;
}
C编译器认为Student 不是一个类型,所以报错。C++认为是一种新的类型,可以直接赋值。
#include <stdio.h> f(i) //C语言默认类型 int f(int i) { printf("i = %d\n", i); } g() //c语言默认类型 int g() { return 5; } int main(int argc, char *argv[]) { f(10); printf("g() = %d\n", g()); //printf("g() = %d\n", g(1, 2, 3)); //在C中,这里打开也能编译通过。反之在C++中fail。 return 0; }
在C语言中,f(i) 和g()函数默认为 int f(int i) 和 int g();
g() 函数在C中可以接受任意的参数,所以在调用的地方写g(1,2,3)也能通过,只不过对传入的参数不处理。
如果C语言中想要表示不接受任何参数,则需要在函数括号中加void。
思考,int f();与int f(void); 的区别是什么?
在C语言中,我们一般习惯用int 类型替代bool类型使用,用0 表示false,用1 表示true。
C++ 在C语言的基本类型之上增加了bool类型,且bool可取的值只有true 和 false。
#include <stdio.h> int main(int argc, char *argv[]) { int a; bool b = true; printf("b = %d, sizeof(b) = %d\n", b, sizeof(b));//sizeof bool 类型变量1,说明bool类型占用一个字节。 b = 3;//编译器在赋值时,将非0值转换为true. a = b; printf("a = %d, b = %d\n", a, b); b = -5; a = b; printf("a = %d, b = %d\n", a, b); a = 10; b = a; printf("a = %d, b = %d\n", a, b); b = 0;//编译器在赋值时,将0值转换为false. printf("b = %d\n", b); return 0; }
范例:bool 类型变量参与运算
#include <stdio.h>
int main(int argc, char *argv[])
{
bool b = false;
printf("b = %d\n", sizeof(b));
b++;
printf("b = %d\n", sizeof(b));
b = b+1;
printf("b = %d\n", sizeof(b));
return 0;
}
用GUN g++ 会报错,在新的gun g++编译器中,禁止bool类型进行自加
1-8.c:6:9: error: use of an operand of type ‘bool’ in ‘operator++’ is forbidden in C++17
dev C++ 运行结果如下:
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 1;
int b = 2;
(a < b ? a : b) = 3;//三目运算符作为左值,然后刚给三目运算符赋值
//(a < b ? 8 : 6) = 3; //用g++ 编译器也会报错,因为这里返回的是常量,常量不能放在赋值符号左边。
//(a < b ? 8 : b) = 3;//用g++ 编译器也会报错,因为这里返回值中有常量。
printf("a = %d, b = %d\n", a, b);
return 0;
}
对于一段连续的存储空间,只能有一个别名吗?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。