C 运算符
发布时间:2026-08-11 | 浏览:6
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,并提供了以下类型的运算符:
本章将逐一介绍算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和其他运算符。
下表显示了 C 语言支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:
请看下面的实例,了解 C 语言中所有可用的算术运算符:
当上面的代码被编译和执行时,它会产生下列结果:
以下实例演示了 a++ 与 ++a 的区别:
下表显示了 C 语言支持的所有关系运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:
请看下面的实例,了解 C 语言中所有可用的关系运算符:
当上面的代码被编译和执行时,它会产生下列结果:
下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 A 的值为 1,变量 B 的值为 0,则:
请看下面的实例,了解 C 语言中所有可用的逻辑运算符:
当上面的代码被编译和执行时,它会产生下列结果:
位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:
假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
下表显示了 C 语言支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:
对两个操作数的每一位执行逻辑与操作,如果两个相应的位都为 1,则结果为 1,否则为 0。
按位与操作,按二进制位进行"与"运算。运算规则:
对两个操作数的每一位执行逻辑或操作,如果两个相应的位都为 0,则结果为 0,否则为 1。
按位或运算符,按二进制位进行"或"运算。运算规则:
对两个操作数的每一位执行逻辑异或操作,如果两个相应的位值相同,则结果为 0,否则为 1。
异或运算符,按二进制位进行"异或"运算。运算规则:
对操作数的每一位执行逻辑取反操作,即将每一位的 0 变为 1,1 变为 0。
取反运算符,按二进制位进行"取反"运算。运算规则:
将操作数的所有位向左移动指定的位数。左移 n 位相当于乘以 2 的 n 次方。
二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
将操作数的所有位向右移动指定的位数。右移n位相当于除以 2 的 n 次方。
二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补 0,负数左补 1,右边丢弃。
请看下面的实例,了解 C 语言中所有可用的位运算符:
当上面的代码被编译和执行时,它会产生下列结果:
下表列出了 C 语言支持的赋值运算符:
请看下面的实例,了解 C 语言中所有可用的赋值运算符:
当上面的代码被编译和执行时,它会产生下列结果:
杂项运算符 ↦ sizeof & 三元
下表列出了 C 语言支持的其他一些重要的运算符,包括 sizeof 和 ? : 。
请看下面的实例,了解 C 语言中所有可用的杂项运算符:
当上面的代码被编译和执行时,它会产生下列结果:
运算符的优先级确定表达式中项的组合。这会影响到一个表达式如何计算。某些运算符比其他运算符有更高的优先级,例如,乘除运算符具有比加减运算符更高的优先级。
例如 x = 7 + 3 * 2,在这里,x 被赋值为 13,而不是 20,因为运算符 * 具有比 + 更高的优先级,所以首先计算乘法 3*2,然后再加上 7。
下表将按运算符优先级从高到低列出各个运算符,具有较高优先级的运算符出现在表格的上面,具有较低优先级的运算符出现在表格的下面。在表达式中,较高优先级的运算符会优先被计算。
请看下面的实例,了解 C 语言中运算符的优先级:
当上面的代码被编译和执行时,它会产生下列结果:
#0 sfvx 268*** [email protected] 555 利用异或 ^ 来交换两个数的值,而且不引入其他变量。 unsigned int a=60; //0011 1100 unsigned int b=13; //0000 1101 a=a^b; //a=a^b=0011 0001 b=a^b; //b=a^b=0011 1100 相当于b1=(a^b)^b a=a^b; //a=a^b=0000 1101 相当于a1=(a^b)^((a^b)^b) 实例 #include<stdio.h> int main( ) { unsigned int a=60; //0011 1100 unsigned int b=13; //0000 1101 printf("a=%d,b=%d",a,b); //输出a,b的值 printf("\n"); a=a^b; //a=a^b=0011 0001 b=a^b; //b=a^b=0011 1100 a=a^b; //a=a^b=0000 1101 printf("a=%d,b=%d",a,b); //输出a,b的值 } 结果: a=60,b=13; a=13,b=60; 仅用一行代码实现的方法: a^=b^=a^=b; 其等价于: a=a^b; b=a^b; a=a^b; 当然,这种利用位运算的交换方法只适用于整型变量,不能用于浮点型变量! sfvx sfvx 268*** [email protected] 9年前 (2017-09-13)
268*** [email protected]
利用异或 ^ 来交换两个数的值,而且不引入其他变量。
当然,这种利用位运算的交换方法只适用于整型变量,不能用于浮点型变量!
268*** [email protected]
#0 BeanShell 286*** [email protected] 241 利用位与 & 运算,判断一个整数是否是2的整数次幂。 二进制数的位权是以2为底的幂,如果一个整数 m 是 2 的 n 次幂,那么转换为二进制之后只有最高位为 1,其余位置为 0,再观察 m-1 转换为二进制后的形式以及 m&(m-1) 的结果,例如: 2 --> 0000 0010 1 --> 0000 0001 2&1 --> 0000 0010 & 0000 0001 = 0 4 --> 0000 0100 3 --> 0000 0011 4&3 --> 0000 0100 & 0000 0011 = 0 8 --> 0000 1000 7 --> 0000 0111 8&7 --> 0000 1000 & 0000 0111 = 0 可以看出所有的 1 完美的错过了,根据位与的特点可知 m&(m-1) 的结果为 0。 如果整数 m 不是 2 的 n 次幂,结果会怎样呢?例如 m=9 时: 9 --> 0000 1001 8 --> 0000 1000 9&8 --> 0000 1001 & 0000 1000 != 0 利用这一特点,即可判断一个整数是否是2的整数次幂。 示例: int func(int num) { return ((num > 0) && ((num & (num - 1)) == 0));//2的n次幂大于0 } 返回值为 1,则输入的正整数为 2 的整数次幂,返回值为 0 则不是。 BeanShell BeanShell 286*** [email protected] 9年前 (2017-11-04)
286*** [email protected]
利用位与 & 运算,判断一个整数是否是2的整数次幂。
二进制数的位权是以2为底的幂,如果一个整数 m 是 2 的 n 次幂,那么转换为二进制之后只有最高位为 1,其余位置为 0,再观察 m-1 转换为二进制后的形式以及 m&(m-1) 的结果,例如:
可以看出所有的 1 完美的错过了,根据位与的特点可知 m&(m-1) 的结果为 0。
如果整数 m 不是 2 的 n 次幂,结果会怎样呢?例如 m=9 时:
利用这一特点,即可判断一个整数是否是2的整数次幂。
返回值为 1,则输入的正整数为 2 的整数次幂,返回值为 0 则不是。
286*** [email protected]
#0 布克F91 335*** [email protected] 124 对取余运算的说明 取余,也就是求余数,使用的运算符是 % 。C 语言中的取余运算只能针对整数,也就是说, % 的两边都必须是整数,不能出现小数,否则编译器会报错。 另外,余数可以是正数也可以是负数,由 % 左边的整数决定: 如果 % 左边是正数,那么余数也是正数; 如果 % 左边是负数,那么余数也是负数; 请看下面的例子: #include <stdio.h> int main() { printf( "100%%12=%d \n100%%-12=%d \n-100%%12=%d \n-100%%-12=%d \n", 100%12, 100%-12, -100%12, -100%-12 ); return 0; } 运行结果: 100%12=4 100%-12=4 -100%12=-4 -100%-12=-4 布克F91 布克F91 335*** [email protected] 8年前 (2018-06-13)
335*** [email protected]
取余,也就是求余数,使用的运算符是 % 。C 语言中的取余运算只能针对整数,也就是说, % 的两边都必须是整数,不能出现小数,否则编译器会报错。
另外,余数可以是正数也可以是负数,由 % 左边的整数决定:
如果 % 左边是正数,那么余数也是正数;
如果 % 左边是负数,那么余数也是负数;
335*** [email protected]
#0 forspy qiu***@126.com 53 对于 2 的幂指数的详细程序 #include <stdio.h> int num; int func(int num) { if ((num>0)&&(num&(num-1))==0) { printf("%d是2的整数次幂",num); } else { printf("%d不是2的整数次幂",num); } return((num>0)&&(num&(num-1))==0); } int main() { printf("请输入要查询的数\n"); scanf("%d",&num); func(num); } forspy forspy qiu***@126.com 8年前 (2018-07-06)
#0 RES 432*** [email protected] 39 不同长度的数据进行位运算 如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。 以“与”运算为例说明如下:我们知道在 C 语言中 long 型占 4 个字节,int 型占 2 个字节,如果一个 long 型数据与一个 int 型数据进行“与”运算,右端对齐后,左边不足的位依下面三种情况补足: (1)如果整型数据为正数,左边补 16 个 0。 (2)如果整型数据为负数,左边补 16 个 1。 (3)如果整形数据为无符号数,左边也补 16 个 0。 如: long a=123;int b=1; 计算 a & b 。 如: long a=123;int b=-1; 计算 a & b 。 如: long a=123; unsigned int b=1; 计算 a & b 。 RES RES 432*** [email protected] 8年前 (2018-07-16)
432*** [email protected]
如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。
以“与”运算为例说明如下:我们知道在 C 语言中 long 型占 4 个字节,int 型占 2 个字节,如果一个 long 型数据与一个 int 型数据进行“与”运算,右端对齐后,左边不足的位依下面三种情况补足:
(1)如果整型数据为正数,左边补 16 个 0。
(2)如果整型数据为负数,左边补 16 个 1。
(3)如果整形数据为无符号数,左边也补 16 个 0。
如: long a=123;int b=1; 计算 a & b 。
如: long a=123;int b=-1; 计算 a & b 。
如: long a=123; unsigned int b=1; 计算 a & b 。
432*** [email protected]
#0 荒城梦呓 449*** [email protected] 69 | 和 ||,& 和 && 的区别 我们将 || 和 && 定义为逻辑运算符,而 | 和 & 定义为位运算符。 && 如果两个操作数都非零,则条件为真; || 如果两个操作数中有任意一个非零,则条件为真。 & 按位与操作,按二进制位进行" 与 "运算。运算规则:(有 0 则为 0) 0&0=0; 0&1=0; 1&0=0; 1&1=1; | 按位或运算符,按二进制位进行" 或 "运算。运算规则:(有 1 则为 1) 0|0=0; 0|1=1; 1|0=1; 1|1=1; 那么,问题来了,在判断语句中,用 | 还是 ||,& 还是 &&? 判断语句中为布尔类型,值只有 true 和 false(如果变量值为 0 就是 false,否则为 true) 举个例子,a=1 b=2 所以 a>0 这个值为true b>1 这个值为true b>2 这个值为 false 如 if(a>0&b>1) 我们可以得出 if(true&true),条件成立(true不为0,所以true&true不为0) 如 if(a>0&&b>1) 我们可以得出 if(true&&true),条件成立(&&两边操作数都非零,所以条件成立) 如 if(b>2&a>0) 我们可以得出 if(false&true),条件不成立(false为0,false&true为0,条件不成立) 如 if(b>2&&a>0) 我们可以得出 if(false&&a>0),条件不成立(&&左侧为false,&&运算到此结束,条件不成立) 可以看出 & 和 && 在判断语句中都可以实现“和”这个功能,不过区别在于 & 两边都运算,而 && 先算 && 左侧,若左侧为 false 那么右侧就不运算了。因此从效率上来说,判断语句中推荐使用 &&(换句话就是逻辑运算就老老实实用逻辑运算符,不然它为啥叫逻辑运算符呢?) 而 | 和 || 的比较与上类似,不做赘述。 荒城梦呓 荒城梦呓 449*** [email protected] 8年前 (2018-08-26)
449*** [email protected]
| 和 ||,& 和 && 的区别
我们将 || 和 && 定义为逻辑运算符,而 | 和 & 定义为位运算符。
&& 如果两个操作数都非零,则条件为真;
|| 如果两个操作数中有任意一个非零,则条件为真。
& 按位与操作,按二进制位进行" 与 "运算。运算规则:(有 0 则为 0)
| 按位或运算符,按二进制位进行" 或 "运算。运算规则:(有 1 则为 1)
那么,问题来了,在判断语句中,用 | 还是 ||,& 还是 &&?
判断语句中为布尔类型,值只有 true 和 false(如果变量值为 0 就是 false,否则为 true)
可以看出 & 和 && 在判断语句中都可以实现“和”这个功能,不过区别在于 & 两边都运算,而 && 先算 && 左侧,若左侧为 false 那么右侧就不运算了。因此从效率上来说,判断语句中推荐使用 &&(换句话就是逻辑运算就老老实实用逻辑运算符,不然它为啥叫逻辑运算符呢?)
而 | 和 || 的比较与上类似,不做赘述。
449*** [email protected]
#0 chiu amo***@126.com 69 a++ 与 ++a 区别在于一个后加,一个先加 。 a++ 输出 a 的值再自加,缓存 a 自加后的结果,用于下次进行与 a 相关的计算。 ++a 则相当于 a+1。 #include <stdio.h> int main(int argc, char **argv) { int a=100; int b=50; // b++; printf("%d,%d\n",a++,++a); printf("%d,%d",b++,++b); return 0; } 运行后输出: 101,102 51,52 若不注释 b++ : int main(int argc, char **argv) { int a=100; int b=50; b++; printf("%d,%d\n",a++,++a); printf("%d,%d",b++,++b); return 0; } 则结果为: 101,102 52,53 chiu chiu amo***@126.com 8年前 (2018-12-21)
a++ 与 ++a 区别在于一个后加,一个先加 。
a++ 输出 a 的值再自加,缓存 a 自加后的结果,用于下次进行与 a 相关的计算。
#0 你哈怂 853*** [email protected] 240 运算符优先级: 括号成员是老大; // 括号运算符 []() 成员运算符. -> 全体单目排老二; // 所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算*、& 乘除余三,加减四; // 这个"余"是指取余运算即% 移位五,关系六; // 移位运算符:<< >> ,关系:> < >= <= 等 等与不等排行七; // 即 == 和 != 位与异或和位或; // 这几个都是位运算: 位与(&)异或(^)位或(|) "三分天下"八九十; 逻辑与,逻辑或; // 逻辑运算符: || 和 && 十一十二紧挨着; // 注意顺序: 优先级(||) 底于 优先级(&&) 条件只比赋值高, // 三目运算符优先级排到 13 位只比赋值运算符和 "," 高 逗号运算最低级! //逗号运算符优先级最低 你哈怂 你哈怂 853*** [email protected] 7年前 (2019-06-13)
853*** [email protected]
853*** [email protected]
#0 已经不认识真了 and*** [email protected] 31 一句话系列。 逻辑是将两个操作值转换成Boolean进行操作。 逻辑与:双真真(双真为真,下同); 逻辑或:单真真; 逻辑非:取反; 没有说明的情况都为假(0) 。 按位是将两个操作值转换成二进制然后 逐位 进行操作。 按位与:双真真; 按位或:有真真(有一个真即为真,两个真的情况也属于有一个真); 按位异或:单真真(区别于有真真,两个真的情况不属于单真); 按位是二进制逐位操作,未说明的皆假。 已经不认识真了 已经不认识真了 and*** [email protected] 7年前 (2019-11-24)
and*** [email protected]
逻辑是将两个操作值转换成Boolean进行操作。
逻辑与:双真真(双真为真,下同);
没有说明的情况都为假(0) 。
按位是将两个操作值转换成二进制然后 逐位 进行操作。
按位或:有真真(有一个真即为真,两个真的情况也属于有一个真);
按位异或:单真真(区别于有真真,两个真的情况不属于单真);
按位是二进制逐位操作,未说明的皆假。
and*** [email protected]
#0 hellolsk 592*** [email protected] 53 c语言中运算符优先级的总结: 初等运算符>单目运算符>算术运算符>关系运算符>逻辑运算符>条件运算符>赋值运算符 初等运算符有:()、[ ]、->、. (后两者均为结构体成员运算符); 单目运算符有:!、~、++、--、sizeof、&、*; 算术运算符有:*、/、+、-、<<、>>; 关系运算符有:<、<=、>、>=、==、!=、&、^、|;(此栏排列仍有优先级顺序哦); 逻辑运算符有:&&、||; 条件运算符有:?:(即三目运算符); 赋值运算符有:=、+=、-=、*=、/=、%=、>>=、<<=;等 另外,单目运算符的优先级都高于双目运算符。 hellolsk hellolsk 592*** [email protected] 6年前 (2020-04-15)
592*** [email protected]
初等运算符>单目运算符>算术运算符>关系运算符>逻辑运算符>条件运算符>赋值运算符
另外,单目运算符的优先级都高于双目运算符。
592*** [email protected]
#0 Long uca*** [email protected] 参考地址 69 在计算机中,负数以其正值的补码形式表达 什么叫补码呢?这得从原码,反码说起。 原码: 一个整数,按照绝对值大小转换成的二进制数,称为原码。 比如 00000000 00000000 00000000 00000101 是 5 的原码。 反码: 将二进制数按位取反,所得的新二进制数称为原二进制数的反码。 取反操作指:原为 1,得 0;原为 0,得 1。(1 变 0; 0 变 1) 比如:将 00000000 00000000 00000000 00000101 每一位取反,得 11111111 11111111 11111111 11111010。 称:11111111 11111111 11111111 11111010是 00000000 00000000 00000000 00000101 的反码。 反码是相互的,所以也可称: 11111111 11111111 11111111 11111010 和00000000 00000000 00000000 00000101 互为反码。 补码: 反码加1称为补码。 也就是说,要得到一个数的补码,先得到反码,然后将反码加上 1,所得数称为补码。 比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。 那么,补码为: 11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011 所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。 Long Long uca*** [email protected] 参考地址 6年前 (2021-02-19)
uca*** [email protected]
在计算机中,负数以其正值的补码形式表达
什么叫补码呢?这得从原码,反码说起。
原码: 一个整数,按照绝对值大小转换成的二进制数,称为原码。
比如 00000000 00000000 00000000 00000101 是 5 的原码。
反码: 将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
取反操作指:原为 1,得 0;原为 0,得 1。(1 变 0; 0 变 1)
比如:将 00000000 00000000 00000000 00000101 每一位取反,得 11111111 11111111 11111111 11111010。
称:11111111 11111111 11111111 11111010是 00000000 00000000 00000000 00000101 的反码。
11111111 11111111 11111111 11111010 和00000000 00000000 00000000 00000101 互为反码。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上 1,所得数称为补码。
比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。
uca*** [email protected]
#0 爱学习的小怪兽 151*** [email protected] 15 "~"运算符 二进制求补运算符(二进制反码运算符、按位反码):对在内存中存储的是补码按位取反(包括符号位)。此时,得到的结果仍为补码,需要进一步转换为原码,得到最终输出信息。 正数的原码、反码、补码是一样的。 对于负数3种码不同: 原码:第一位表示符号位,其余位表示数值。 反码:符号位不变,其余按位取反。 补码:反码加1称为补码。补码=反码+1,反码=补码-1。 1的原码、反码、补码: a = 00000000 00000000 00000000 0000001 ~1的补码 b = 11111111 11111111 11111111 11111110 ~1的反码 c = b -1 = 11111111 11111111 11111111 11111101 ~1的原码 d = 10000000 00000000 00000000 00000010 ~1 = -2 0的原码、反码、补码: a = 00000000 00000000 00000000 0000000 ~0的补码 b = 11111111 11111111 11111111 11111111 ~0的反码 c = b -1 = 11111111 11111111 11111111 11111110 ~1的原码 d = 10000000 00000000 00000000 00000001 ~0 = -1 爱学习的小怪兽 爱学习的小怪兽 151*** [email protected] 3年前 (2023-07-09)
151*** [email protected]
二进制求补运算符(二进制反码运算符、按位反码):对在内存中存储的是补码按位取反(包括符号位)。此时,得到的结果仍为补码,需要进一步转换为原码,得到最终输出信息。
正数的原码、反码、补码是一样的。
原码:第一位表示符号位,其余位表示数值。
反码:符号位不变,其余按位取反。
补码:反码加1称为补码。补码=反码+1,反码=补码-1。
1的原码、反码、补码: a = 00000000 00000000 00000000 0000001
~1的补码 b = 11111111 11111111 11111111 11111110
~1的反码 c = b -1 = 11111111 11111111 11111111 11111101
~1的原码 d = 10000000 00000000 00000000 00000010
0的原码、反码、补码: a = 00000000 00000000 00000000 0000000
~0的补码 b = 11111111 11111111 11111111 11111111
~0的反码 c = b -1 = 11111111 11111111 11111111 11111110
~1的原码 d = 10000000 00000000 00000000 00000001
151*** [email protected]
Python / 数据科学 Python 教程 Python2.x 教程 FastAPI 教程 Flask 教程 Django 教程 NumPy 教程 Pandas 教程 SciPy 教程 Matplotlib 教程 Dash 教程 Jupyter Notebook 教程 Pillow 教程 量化交易 R 教程 Julia 教程
Jupyter Notebook 教程
AI / 智能开发 AI Agent(智能体) AI(人工智能) Codex 教程 Vibe Coding 教程 Claude Code OpenCode Skills(技能) Ollama 教程 Hermes Agent Pi Agent AI 数学基础 TensorFlow 教程 PyTorch 教程 Scikit-learn 教程 机器 教程 LangChain 自然语言处理 NLP OpenCV 教程 Selenium 教程 Playwright 教程
Scikit-learn 教程
前端开发 HTML 教程 HTML5 教程 CSS 教程 CSS3 教程 JavaScript 教程 HTML DOM 教程 TypeScript 教程 AJAX 教程 JSON 教程 Tailwind CSS 教程 Bootstrap4 教程 Bootstrap5 教程 Foundation 教程 Vue.js 教程 Vue3 教程 React 教程 Next.js 教程 AngularJS 教程 Angular 教程 jQuery 教程 jQuery UI 教程 jQuery EasyUI 教程 ECharts 教程 Chart.js 教程 Highcharts 教程 Google 地图 教程 SVG 教程 Font Awesome 教程
Tailwind CSS 教程
jQuery EasyUI 教程
Font Awesome 教程
后端开发 Node.js 教程 Electron 教程 PHP 教程 Java 教程 Go 教程 Rust 教程 C# 教程 Servlet 教程 JSP 教程 ASP 教程 AppML 教程 VBScript 教程 Swagger 教程 RESTful API 教程 Docker 教程 Linux 教程 ZooKeeper 教程
数据库 SQL 教程 MySQL 教程 PostgreSQL 教程 SQLite 教程 MongoDB 教程 Redis 教程 Memcached 教程
移动开发 Android 教程 Flutter 教程 Ionic 教程 jQuery Mobile 教程 Swift 教程 Kotlin 教程
jQuery Mobile 教程
DevOps / 工程化 Git 教程 SVN 教程 CMake 教程 Maven 教程 VS Code 教程 Obsidian 教程 PyCharm 教程 Eclipse 教程 Markdown 教程
编程语言 C 教程 C++ 教程 Zig 教程 Scala 教程 Ruby 教程 Perl 教程 Lua 教程 Dart 教程 汇编语言 教程 Verilog 教程
计算机基础 计算机组成原理 数据结构与算法 C 语言数据结构与算法 设计模式 Python 设计模式 正则表达式 HTTP 教程 TCP/IP 教程 网络协议 W3C 教程
XML / Web Service XML 教程 DTD 教程 XML DOM 教程 XSLT 教程 XPath 教程 XQuery 教程 XLink 教程 XPointer 教程 XML Schema 教程 XSL-FO 教程 Web Service 教程 WSDL 教程 SOAP 教程 RSS 教程 RDF 教程
.NET ASP.NET 教程 MVC 教程 Razor 教程 Web Forms 教程 Web Pages 教程 PowerShell 教程
网站建设 网站建设指南 浏览器信息 网站主机教程 网站品质