P1.const、static用法、左移右移

1. const

1.1 const修饰整型变量,变量的值不可直接更改(常变量)

const int a=10;
a=5;//错误,不可更改
int *p=&a;
*p=6;//通过地址变量解引用后可更改,此时a的值变为6

1.2 const修饰指针变量

int *const p=&a;//此时指针p无法更改,只能存储a的地址
//此时执行以下操作
*p=3;//成功,可以更改p所存储地址对应的变量值
p=&b;//错误,不可更改p的值
const int*p=&a;//修饰指向的内容
//此时执行以下操作
*p=7;//错误,无法通过解引用更改
a=7;//正确,更改成立,可直接更改
p=&b;//正确,可更改p的值

2. static

2.1 static修饰局部变量

此时局部变量为静态局部变量,会改变局部变量的存储位置,使其生命周期变长,但不改变作用域

void test()
{
	int x = 0;
	x++;
	printf("%d ", x);
}
 
int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

输出结果为:1 1 1 1 1 1 1 1 1 1

void test()
{
	static int x = 0;
	x++;
	printf("%d ", x);
}
 
int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}
 

此时输出结果变成了:1 2 3 4 5 6 7 8 9 10

2.2 static修饰全局变量

全局变量范围广,在一个文件中定义以后,在自己的文件内可以直接使用,在另一个文件内进行外部声明后也可使用。

int m=1;//第一个文件内定义变量m
extern int m;//另一个文件内外部声明一下即可使用

但static修饰全局变量后改变了全局变量的链接属性,就只能在一个文件内使用了

2.3 static修饰函数

自定义函数在一个文件内定义后(例如int add(int x;int y)),可以在另一个文件内使用外部声明使用这个函数

extern int add(int x;int y);

与修饰全局变量类似,static修饰函数后声明之后在另一个文件也无法使用该函数

3. 左移、右移操作符<<、>>

b=a<<1;//相当于将a的补码整体向左移一位,符号位不变,然后最右边补一个0。如5变成10,-5变成-10

32位操作系统中,内存中存储的是32个bit位的补码

算数右移:最低位舍去,二进制补码整体向右移动一位,高位补符号位(用于有符号数)

逻辑右移:最低为舍去,二进制补码整体向右移动一位,高位补0(用于无符号数)

左移、右移操作符中一般使用的是算数左移、右移

这段代码位于gmesh开源代码中的`meshGFace::setGeoDeflection`函数中,用于计算三维网格面的几何细化。其作用是计算面上点的几何细化因子,以便在对网格进行细化时使用。 具体来说,该代码段中的if语句是用于判断当前点的几何细化因子是否需要更新。在if语句的条件中,`P1.p`和`P2.p`分别表示当前点到两个相邻点的距离,`d`表示当前点到边的距离。如果当前点到边的距离大于等于两个相邻点的距离的绝对值,且当前点到第一个相邻点的距离小于边的距离的绝对值,则需要更新当前点的几何细化因子。 如果需要更新当前点的几何细化因子,则代码会继续计算当前点的几何细化因子。在这里,代码首先计算当前点到两个相邻点的距离差`dp`、参数值差`dt`和几何细化因子的差`dlc`。然后,根据公式`t = P1.t + dt / dp * (d - P1.p)`计算当前点的参数值`t`。接下来,代码调用`ge->firstDer(t)`函数计算参数值为`t`时边的一阶导数,再用`norm`函数计算导数的模长`d`。最后,根据公式`lc = d / (P1.lc + dlc / dp * (d - P1.p))`计算当前点的几何细化因子`lc`。 需要注意的是,代码中的变量`d`在if语句中已经被定义为当前点到边的距离,因此在计算几何细化因子时,需要使用另一个变量名来避免重复定义。因此,在计算几何细化因子时,代码中的`d`变量表示导数的模长。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值