《C语言解惑》读后总结:
优先级等级口诀
圆方括号、箭头一句号。自增自减非反负、针强地址长度(从右往左结合)
乘除,加减,再移位,
小等大等、等等不等,
八位与,七位异,六位或,五与,四或,三疑,二赋,一真逗。
其中“,”号为一个等级分段。
1.赋值操作符的关联顺序是从右向左。
<textarea readonly="readonly" name="code" class="c++">
int x = 2;int y,z;
x *= y = z = 2;
输出:x = 2;
</textarea>
赋值操作符的优先级低于等号的优先级;(注意表达式的值和变量的值不一样,看明白是要求什么的值)
<textarea readonly="readonly" name="code" class="c++">
#define PRINTX printf("%d\n",x)
int x =1,z = 4;int y;
x == (y = z) ;PRINTX
输出:PRINTX的值:1(x = 1);表达式[x == (y = z)]->[x == 4]的值:0(False);
</textarea>
2.逻辑运算符和增量运算符(&&优先级大于||)
<textarea readonly="readonly" name="code" class="c++">
#define PRINT(int) printf("%d\n",int)
x =1, y= 1,z =0;
PRINT(x || !y && z) ##1.&&优先级大于|| 2.(m || n)m为true时,n舍弃不计算 3.(m && n)m为false时,n舍弃不计算####
输出:(x || !y && z)->(TRUE || 任意值 ) -> TRUE(1)
</textarea>
3.二进制位运算(&优先级大于|)注意(位运算 > 逻辑运算)
4.关系操作符和条件操作符
<textarea readonly="readonly" name="code" class="c++">
x=3;y=3;z=1;求表达是z的值;
(z += x < y ? x++; y++)
-> (z += (x < y ? x++; y++))
-> (z += (y++)) 此时的y=4;
-> (z = z + 3)
-> ( z = 4)
</textarea>
自增自减的优先级 > 逻辑操作符的优先级
<textarea readonly="readonly" name="code" class="c++">
x =y =z = 1;
(++x || ++y && ++z)
->((++x) || (++y && ++z))
->(2 || (++y && ++z))
->(2 || 任意值)
->(x ==2; y = z =1;)
</textarea>
二.基本运算
1.语句的嵌套。while语句中时刻注意符号的优先级;
<textarea readonly="readonly" name="code" class="c++">
while(c = NEXT(i) != EOS)
这个表达是如果NEXT(i) != EOS那么c永远等于TRUE,while一直循环下去。
</textarea>
三.存储类
在C语言里面每一个变量都有三个最基本的属性:类型,作用域和生命期。
一个变量的类型决定着这个变量需要占用多大的空间以及对这个变量可以
进行哪些操作。
作用域:说的是这个变量在程序上下文里的哪些部分是可见的。变量的
作用域由它在程序里的声明位置来控制。作用域的边界是块,函数和文件。
生命期:是一个变量在程序执行期间的哪些时候能够有一个值。变量的
生命期是由存储类型来控制的。
1.块
<textarea readonly="readonly" name="code" class="c++">
#include <stdio.h>
int i = 0; (i.0) // 0层语句块
int main()
{ // 1层语句块
auto int i =1; (i.1)
print("%d",i); ★1
{ // 2层语句块
int i = 2; (i.2) //作用域是整个第二层
print("%d",i);
{ // 3层语句块
i += 1;
print("%d",i); //3 被输出,因为此时它是名字是“i”的最内层变量
}
print("%d",i);
} //2层语句块到此声明期已经结束,即i.2已经死亡,
print("%d",i); //此时i.1变成了名字是“i”的最内层变量
}
输出结果是:1 2 3 3 1
★1:当两个变量使用相同的名字时,若只写出变量名时引用的是最内层的变量;
外层的变量无法引用到。
</textarea>
<textarea readonly="readonly" name="code" class="c++">
#include "stdio.h"
int i = 0; // 0层语句块
int main()
{ // 1层语句块
auto int i =1;
printf("%d",i);
{ // 2层语句块
int i = 2;
printf("%d",i);
{
int i = 2; (i.3)// 3层语句块
i += 1;
printf("%d",i);
} //3层语句块到此声明期已经结束,即(i.3)已经死亡,
printf("%d",i);
} //2层语句块到此声明期已经结束,即已经死亡,
printf("%d",i); //此时
}
输出结果是:1 2 3 2 1
</textarea>
2.函数
<textarea readonly="readonly" name="code" class="c++">
#include "stdio.h"
int i =1;
void main()
{
auto i, j;
i = reset();
for(j=1; j<=3; j++)
{
printf("%d,%d\n", i,j);
printf("%d\n", next(i));
printf("%d\n",last(i+j));
printf("%d\n",news(i+j));
}
}
int reset()
{
return i;
}
int next(int j)
{
return (j=i++);
}
int last(int j)
{
static int i =10;
return (j=i--);
}
int news(int i)
{
auto int j =10;
return (i=j+=i);
}
输出结果:
1,1
1
10
12
1,2
2
9
13
1,3
3
8
14
</textarea>
优先级等级口诀
圆方括号、箭头一句号。自增自减非反负、针强地址长度(从右往左结合)
乘除,加减,再移位,
小等大等、等等不等,
八位与,七位异,六位或,五与,四或,三疑,二赋,一真逗。
其中“,”号为一个等级分段。
文章参考链接:http://www.xianjiaxin198.com/
http://blog.csdn.net/dawndu/article/details/662354
一. 赋值操作符1.赋值操作符的关联顺序是从右向左。
<textarea readonly="readonly" name="code" class="c++">
int x = 2;int y,z;
x *= y = z = 2;
输出:x = 2;
</textarea>
赋值操作符的优先级低于等号的优先级;(注意表达式的值和变量的值不一样,看明白是要求什么的值)
<textarea readonly="readonly" name="code" class="c++">
#define PRINTX printf("%d\n",x)
int x =1,z = 4;int y;
x == (y = z) ;PRINTX
输出:PRINTX的值:1(x = 1);表达式[x == (y = z)]->[x == 4]的值:0(False);
</textarea>
2.逻辑运算符和增量运算符(&&优先级大于||)
<textarea readonly="readonly" name="code" class="c++">
#define PRINT(int) printf("%d\n",int)
x =1, y= 1,z =0;
PRINT(x || !y && z) ##1.&&优先级大于|| 2.(m || n)m为true时,n舍弃不计算 3.(m && n)m为false时,n舍弃不计算####
输出:(x || !y && z)->(TRUE || 任意值 ) -> TRUE(1)
</textarea>
3.二进制位运算(&优先级大于|)注意(位运算 > 逻辑运算)
4.关系操作符和条件操作符
<textarea readonly="readonly" name="code" class="c++">
x=3;y=3;z=1;求表达是z的值;
(z += x < y ? x++; y++)
-> (z += (x < y ? x++; y++))
-> (z += (y++)) 此时的y=4;
-> (z = z + 3)
-> ( z = 4)
</textarea>
自增自减的优先级 > 逻辑操作符的优先级
<textarea readonly="readonly" name="code" class="c++">
x =y =z = 1;
(++x || ++y && ++z)
->((++x) || (++y && ++z))
->(2 || (++y && ++z))
->(2 || 任意值)
->(x ==2; y = z =1;)
</textarea>
二.基本运算
1.语句的嵌套。while语句中时刻注意符号的优先级;
<textarea readonly="readonly" name="code" class="c++">
while(c = NEXT(i) != EOS)
这个表达是如果NEXT(i) != EOS那么c永远等于TRUE,while一直循环下去。
</textarea>
三.存储类
在C语言里面每一个变量都有三个最基本的属性:类型,作用域和生命期。
一个变量的类型决定着这个变量需要占用多大的空间以及对这个变量可以
进行哪些操作。
作用域:说的是这个变量在程序上下文里的哪些部分是可见的。变量的
作用域由它在程序里的声明位置来控制。作用域的边界是块,函数和文件。
生命期:是一个变量在程序执行期间的哪些时候能够有一个值。变量的
生命期是由存储类型来控制的。
1.块
<textarea readonly="readonly" name="code" class="c++">
#include <stdio.h>
int i = 0; (i.0) // 0层语句块
int main()
{ // 1层语句块
auto int i =1; (i.1)
print("%d",i); ★1
{ // 2层语句块
int i = 2; (i.2) //作用域是整个第二层
print("%d",i);
{ // 3层语句块
i += 1;
print("%d",i); //3 被输出,因为此时它是名字是“i”的最内层变量
}
print("%d",i);
} //2层语句块到此声明期已经结束,即i.2已经死亡,
print("%d",i); //此时i.1变成了名字是“i”的最内层变量
}
输出结果是:1 2 3 3 1
★1:当两个变量使用相同的名字时,若只写出变量名时引用的是最内层的变量;
外层的变量无法引用到。
</textarea>
<textarea readonly="readonly" name="code" class="c++">
#include "stdio.h"
int i = 0; // 0层语句块
int main()
{ // 1层语句块
auto int i =1;
printf("%d",i);
{ // 2层语句块
int i = 2;
printf("%d",i);
{
int i = 2; (i.3)// 3层语句块
i += 1;
printf("%d",i);
} //3层语句块到此声明期已经结束,即(i.3)已经死亡,
printf("%d",i);
} //2层语句块到此声明期已经结束,即已经死亡,
printf("%d",i); //此时
}
输出结果是:1 2 3 2 1
</textarea>
2.函数
<textarea readonly="readonly" name="code" class="c++">
#include "stdio.h"
int i =1;
void main()
{
auto i, j;
i = reset();
for(j=1; j<=3; j++)
{
printf("%d,%d\n", i,j);
printf("%d\n", next(i));
printf("%d\n",last(i+j));
printf("%d\n",news(i+j));
}
}
int reset()
{
return i;
}
int next(int j)
{
return (j=i++);
}
int last(int j)
{
static int i =10;
return (j=i--);
}
int news(int i)
{
auto int j =10;
return (i=j+=i);
}
输出结果:
1,1
1
10
12
1,2
2
9
13
1,3
3
8
14
</textarea>
四,指针和数组
文章参考链接:http://www.xianjiaxin198.com/ 西安嘉信铁路器材有限公司
http://download.csdn.net/detail/ampliocheung/4449463 c语言解惑下载