C语言 if、for、goto、位运算、位段、函数(2018.11.18)

if语句

 if(表达式)
{
	语句1;
}
else
{
	语句2;
}

在使用if语句判断条件的时候要注意符号的结合性
eg:

if(5 <= x <= 20)
if(5 <= x && x <= 20)

语句1与语句2判断的条件不一样。
语句1: (5 <= x) <=20,先判断x是否大于5,返回0或者1,再与20比较。所以这判断条件恒成立。达不到要判断x是否在5到20的范围内。
语句2:判断x是否在5到20内。

与零值做比较
浮点变量
只能比较精度
指针变量
与NULL比较

swicth语句

switch(表达式)
 {
            case 常量表达式 1:  语句 1;         
            case 常量表达式 2:  语句 2;        
             …           
             case 常量表达式 n:  语句 n;         
             default :  语句 n+1;         
 } 

要注意,一般来说,使用switch时, case 常量表达式 1: 语句 1; break;,要加break。但是break不是switch自带的。可以在一定情况下不加。
eg:
当 条件为5、6、7时,执行相同。

switch(表达式)
 {
            case 5:   
            case 6:          
            case 7:  printf(“1”);    break;  
            case 8:  printf(“2”) ;   break;
            default :          
 } 

但是7、8执行的东西不一样,所以要加break,不然的话当执行完7后,会继续执行下面的语句。输出就发生错误。
default可以放在任何地方。但是放在任何地方时,要记得加break。不然会继续执行下面的语句。
default不需要用到时最好也写一下【default: break;】,不然别人会觉得你忘记写。

whilefordo while

while(判断条件)
{
	语句;
}
//直到不满足条件后,结束循环

do
{
	循环体;
}
while(条件);
//先执行循环体一次后,再按段条件。所以do-while结构至少执行一次循环体;
//直到不满足条件后,结束循环

for(表达式1;表达式2;表达式3)
{
	循环体;
}

for与while都是当型循环,他们可以互相转换。
do while转换为while只需要在while前面多写一次循环体。
但是while 无法转换为 do while
注意
写do while时的最好是:

do{
	循环体;

}while(条件);

goto

	  goto state;
      char s1, s2; // 被goto 跳过
      int sum = 0; // 被goto 跳过
      state:

不能随意使用,因为他可以随意跳出,会破坏程序的结构。
goto多数用来:在多重循环的最里层,跳出到最外层。
goto没有自带判断语句,所以一般配搭if使用。

int i = 0;
int a[i];
是不可以的。因为系统虽然给i分配了内存空间,但是在编译的时候i没有值,只有在运行的时候有值。但是在编译的时候a[]数组就要i的变量,这时候i的变量是垃圾值,数组的长度就变成垃圾长度了。

按位与&
x & y
x=1,y=1,x&y =1
其他=0;
同一为一
【一般用来使原码为0】

按位或
x | y
x=0,y =0, x | y=0
同0为0
【一般用来使原码为1】

按位异或
x ^ y
相同为0,不相同为1

按位取反
~x

按位左移
x << 位数
低位补0,高位溢出

按位右移
x >> y
移出的低位舍弃,分两种补位方法。
对无符号数和有符号正数,补0
有符号负数
1、逻辑右移:补0
2、算术右移:补1

位段
所谓位段类型,是一种特殊的结构类型,其所有成员均以二进制位为单位定义长度,并称成员为位段。

struct status
    {  unsigned sign:        1;  	/*符号标志*/
        unsigned zero:        1;  	/*零标志*/
        unsigned carry:       1;  	/*进位标志*/
        unsigned :                0;  	/*长度为0的无名位段*/
        unsigned parity:       1;  	/*奇偶/溢出标志*/
        unsigned half_carry: 1;  	/*半进位标志*/
	unsigned negative:    1;  	/*减标志*/
     } flags;

因为位段类型是一种结构类型,所以位段类型和位段变量的定义,以及对位段(即位段类型中的成员)的引用,均与结构类型和结构变量一样。
对位段赋值时,要注意取置范围。一般地说,长度为n的位段,其取值范围是:0~(2n-1)。
使用长度为0的无名位段,可使其后续位段从下1个字节开始存储。
对CPU的状态寄存器而言,使用位段类型,比使用结构类型节省。

带参数的main函数和命令行参数
main(int argc, char *argv[ ])

可变参数列表
#include<stdarg.h>中定义了
typedef struct{
char *ao;
int offset;
}va_list;

所以在使用的时候不用再定义了。

控制函数:
void va_start(va_list ap,last);
type va_arg(va_list ap,type);
void va_end(va_list ap);
void va_copy(va_list dest,va_list src);
调用参数表以前,定义一个va_list类型变量

变量作为函数参数是单向传递的
指针作为函数参数是双向传递的

递归函数
在函数调用时,直接或间接地自己调用自己的函数称为递归函数。
第一阶段称为“递推”阶段,第二阶段称为“回归”阶段
递归的条件:
1、须有完成函数任务的语句;
2、一个确定是否能避免递归调用的测试;
3、一个递归调用语句;
4、先测试,后递归调用。
递归时,每次递归都要给调用函数分配内存空间,所以递归并不既节省空间和时间,与调用其他函数相同。
只是节省了编程时间,使编程简化。

返回指针值的函数
类型 *函数名(形参列表)
int *a(int x, int y)

猜你喜欢

转载自blog.csdn.net/Rayyyyyyy/article/details/84205602
今日推荐