笔记
Wind_Crazy
好多语言啊
展开
-
NormalMatrix
NormalMatrix怎么算或者为什么这么算?许多计算是在view space中完成的。这与光照通常在该空间中执行的操作有关,否则摄像机位置相关的效果(例如镜面光)将更难实现。因此,我们需要一种将法线转换为view space的方法(有时候会在世界空间根据原理更改即可)。要将顶点转换为view space,我们可以编写:vertexEyeSpace = gl_ModelViewMatrix * gl_Vertex;那么为什么我们不能对法线向量做同样的事情呢?法线是 3 个浮点数的向量,模型视图矩翻译 2022-05-25 13:26:01 · 234 阅读 · 0 评论 -
抽象类与接口的小玩笑
在网上看到的1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。2 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染)。...原创 2021-10-15 12:25:58 · 134 阅读 · 0 评论 -
#params 关键字
使用 params 关键字可以指定采用数目可变的参数的方法参数。 参数类型必须是一维数组。在方法声明中的 params 关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个 params 关键字。如果 params 参数的声明类型不是一维数组,则会发生编译器错误 CS0225。使用 params 参数调用方法时,可以传入:1数组元素类型的参数的逗号分隔列表。2指定类型的参数的数组。3无参数。 如果未发送任何参数,则 params 列表的长度为零。using System;namesp原创 2021-10-13 22:06:10 · 404 阅读 · 0 评论 -
#Null 合并运算符( ?? )
#Null 合并运算符( ?? )如果第一个操作数的值为 null,则运算符返回第二个操作数的值,否则返回第一个操作数的值using System;namespace NULLABLE{ class A { static void Main(string[] args) { double? a = null; double? b = 3.14157; double c = 9;原创 2021-10-13 21:18:58 · 234 阅读 · 0 评论 -
#decimal运算法则
#decimal运算法则decimal 类型值的运算结果是这样得出的:先计算一个精确结果(按每个运算符的定义保留小数位数),然后舍入以适合表示形式。结果舍入到最接近的可表示值,当结果同样地接近于两个可表示值时,舍入到最小有效位数位置中为偶数的值(这称为“银行家舍入法”)。零结果总是包含符号 0 和小数位数 0。银行家舍入就是四舍六入五取偶法,其规则是:当舍去位的数值小于5时,直接舍去该位;当舍去位的数值大于等于6 时,在舍去该位的同时向前位进一;当舍去位的数值等于5时,如果前位数值为奇,则在舍去该位的原创 2021-10-10 18:38:07 · 1252 阅读 · 0 评论 -
#值类型的构造函数
所有值类型都隐式声明一个称为默认构造函数 (default constructor) 的公共无参数实例构造函数。默认构造函数返回一个零初始化实例,它就是该值类型的默认值 (default value)所以在下面的示例中,变量 i 和 j 都被初始化为零。class A{ void F() { int i = 0; int j = new int(); }}bool类型默认为false...原创 2021-10-10 15:16:17 · 96 阅读 · 0 评论 -
#名称隐藏-2(通过继承的名称隐藏)
#名称隐藏-2(通过继承的名称隐藏)当类或结构重新声明从基类继承的名称时,会发生通过继承的名称隐藏。这种类型的名称隐藏采取下列形式之一:• 类或结构中引入的常量、字段、属性、事件或类型会把所有同名的基类成员隐藏起来。• 类或结构中引入的方法隐藏所有同名的非方法基类成员,以及所有具有相同签名(方法名称和参数个数、修饰符和类型)的基类方法。• 类或结构中引入的索引器隐藏所有具有相同签名(参数个数和类型)的基类索引器。管理运算符声明的规则使派生类不可能声明与基类中的运算符具有相同签名的运算符。因此,运算原创 2021-10-05 22:17:41 · 930 阅读 · 0 评论 -
#名称隐藏-1(通过嵌套的名称隐藏)
#名称隐藏-1(通过嵌套的名称隐藏)以下各项会导致发生通过嵌套的名称隐藏:在命名空间内嵌套其他命名空间或类型;在类或结构中的嵌套类型;声明形参和局部变量。在下面的示例中class A{ int i = 0; void F() { int i = 1; } void G() { i = 1; }}在方法 F 中,实例变量 i 被局部变量 i 隐藏,但在方法 G 中,i 仍引用该实例变量。当内部范围中的名称隐藏外部范围中的名称时,它隐藏该名称的所有重载匹配项。在下面的示例中c原创 2021-10-05 21:58:36 · 1527 阅读 · 0 评论 -
#范围 (scope)-2
#范围 (scope)-2块中名称的含义可能因该名称的使用上下文而异。在下面的示例中using System;class A {}class Test{ static void Main() { string A = "hello, world"; string s = A; // 表达式上下文 Type t = typeof(A); // 类型上下文 Console.WriteLine(s); // "hello, world" Consol原创 2021-10-05 21:35:30 · 96 阅读 · 0 评论 -
#范围 (scope)-1
#范围 (scope)-1在命名空间、类、结构或枚举成员的范围内,可以在位于该成员的声明之前的文本位置引用该成员。例如class A{ void F() { i = 1; } int i = 0;}这里,F 在声明 i 之前引用它是有效的。在局部变量的范围内,在位于该局部变量的 local-variable-declarator 之前的文本位置引用该局部变量是编译时错误。例如class A{ int i = 0; void F() { i = 1; // 错误原创 2021-10-05 21:26:58 · 133 阅读 · 0 评论 -
warning C4013: ‘malloc‘ undefined;‘free‘ undefined; assuming extern returning int
忘记写#include<stdlib.h>了原创 2021-09-17 18:25:46 · 1503 阅读 · 0 评论 -
warning C4013: ‘strcpy‘ undefined; assuming extern returning int
忘记写#include<string.h>了,大意了原创 2021-09-17 18:23:41 · 2024 阅读 · 0 评论 -
#尝试编写用指针作为参数的程序完成变量a与变量b中数据的交换##C语言
尝试编写用指针作为参数的程序完成变量a与变量b中数据的交换要求:(1)数据的交换由函数来完成(2)用指针作为函数参数程序:#include<stdio.h>int trans(int *a,int *b);void main(){ int *a1,*b1; int a,b; a=1;b=2; a1=&a;b1=&b; printf("未换时a=%d,b=%d\n",a,b); trans(a1,b1); printf("在trans函数中交换后的m原创 2021-05-07 20:07:52 · 575 阅读 · 0 评论 -
#回显是什么意思
#回显是什么意思回显输入就是,用户输入的字符直接显示在电脑屏幕上。无回显输入就是,敲键盘后屏幕不显示你所敲的字符。一些编译器支持无缓冲输入的函数在conio.h头文件中如:回显无缓冲输入getche()和无回显无缓冲输入getch()(这个可以帮你稍微了解回显)#include <stdio.h>#include <conio.h>int main(void){ char ch; ch = getch(); printf("%c",ch);原创 2021-05-05 17:04:25 · 6905 阅读 · 1 评论 -
for循环
这个for循环惊到我了#include <stdio.h>int main(){ int k; for (k=1,printf("%d:Hi!\n",k); printf("k=%d\n",k),k*k < 26; k += 2 ,printf("Now k is %d\n",k)) printf("k is %d in the loop\n",k); return 0;}运行结果如下:1:Hi!k=1k is 1 in the loopNow k is原创 2021-04-18 17:10:36 · 61 阅读 · 0 评论 -
#类型转换
在表达式中使用类型转换一定要先进行转换在进行表达式的运算如:i=(long)(num*num);i=((long)num)*num;第一个不安全的原因在于,计算平方时使用的是int类型,对于较大的值会越界,发生截断,转换long类型后还是截断后的结果。一定要使用第二个;第一个不安全一定要使用第二个;第一个不安全一定要使用第二个;第一个不安全咳咳,三遍了┴┤・ω・)ノ...原创 2021-04-18 16:40:38 · 92 阅读 · 0 评论 -
2021-04-18
函数原型的返回值可以是表达式原创 2021-04-18 16:29:03 · 48 阅读 · 0 评论 -
#scanf的&使用
#scanf的&使用 1、scanf("%lf",m[2]); 2、scanf("%lf",&m[2]); 3、scanf("%lf",&m);写入数组正确的用法应当是第2种 char s[8]; scanf("%s",s);使用scanf()函数处理字符串时没有使用&符号通常在写入字符串时从第1个元素开始顺序写入,而数组名(s或mint)就是第1个元素的地址,因此不建议使用&符号表示第1个元素的地址。但是当我们向某一个确定位置的元素写入数据时需原创 2021-04-18 16:16:55 · 198 阅读 · 0 评论 -
#while语句(关于自增自减)
#while语句(关于自增自减)观看下面一段代码index=0;while(index++<10) sam=10*index+2;printf("sam=%d\n",sam);对于while语句,index++自增符号仍然还是先赋值再增;在此代码中表现为先判断再自增,即:第一次判断为0<10,判断为真,进入while循环,sam=101+2;index++<10作为while循环的测试条件,是一个完整表达式,该表达式的结束是一个序列点,所以sam的第一次赋值不会是100+2原创 2021-04-07 13:38:46 · 1267 阅读 · 0 评论