第五章--基本概念

来源:互联网 发布:免费域名邮箱 编辑:程序博客网 时间:2024/06/06 02:26

1.1 赋值语句

例题1:

int i = 1;

int main() {
int i = i; 
return 0;
}

//p29 该程序编译通过,但有执行错误:the variable 'i' is being used without being initialized.

例题2:

int main() {
int x=2, y, z;
int *p = NULL;
p = &x;
x *=(y=z=5);
printf("x1 is %d\n", x);
//print one pointer's value.
printf("p2 is %p\n", p);
z=3;
x==(y=z);
printf("x3 is %d\n", x); 
x=(y==z);
printf("x4 is %d\n", x);
x=(y&z);
printf("x5 is %d\n", x);
x=(y&&z);
printf("x6 is %d\n", x);
y=4;
x=(y|z);
printf("x7 is %d\n", x);
x=(y||z);
printf("x8 is %d\n", x);
return 0;
}


//P30 该程序编译结果如下图所示:


为了便于查看输出,每个输出有不同的标志。

由于X3之前是比较表达式,并不会改变X的值,所以其值仍然是10.

X4是条件判断表达式(y==z)的值.

X5是位与操作。X6是与操作。X7是位或操作。X8是或操作。


例题3:

int func(int x) {
int count = 0;
while(x){
count++;
x=x&(x-1);
}
return count;
}
int main() {
int ret=0;
ret=func(5);
printf("ret is %d\n", ret);
return 0;
}

//P31 你可以举出个例子来试下。

1.2 i++

例题1:

int main() {
int a,x;
//! and ++ is same level priority. but x++ is x used first and ++
for(a=0,x=0;(a<=1)&&(!x++);a++){
a++;
}
printf("a is %d\n", a);
        printf("x is %d\n", x);
return 0;
}

// a is 2; x is 1.

int main() {
int a,x;
//! and ++ is same level priority.. but x++ is x used first and ++
for(a=0,x=0;(a<=1)&&(!x++);){
a++;
}
printf("a is %d\n", a);
printf("x is %d\n", x);
return 0;
}


// a is 1; x is 2.


// P31主要几个知识点:优先级的判断;与操作;X++使用与自增的先后顺序;for循环(表达式1;表达式2;表达式3){执行主体}.

与操作:当与操作的前面表达式已经为假时,不执行与操作后面的表达式;当与操作的前面表达式已经为真时,才执行后面的表达式。

for循环:先执行表达式1,当满足表达式2时,才执行主体,然后执行表达式3;当不满足表达式2时,直接执行表达式3,不断循环。

例题2:

int main() {
int b=3, i = 0, len = 0;
int arr[]={6,7,8,9,10};
len = sizeof(arr)/sizeof(int);
//pointer array. 
int *m_ptr[5];
//pointer which points to the int array having five elements.
int (*n_ptr)[5];

//arr is arr[0]; &arr is entire array.
printf("the address of arr is %p\n", arr);
printf("the address of &arr[0] is %p\n", &arr[0]);
printf("the address of arr+1 is %p\n", arr+1);

printf("the address of &arr is %p\n", &arr);
printf("the address of &arr+1 is %p\n", &arr+1);

for(i=0; i < len; i++) {
m_ptr[i] = &arr[i];
printf("*m_ptr[i] is %d\n",*m_ptr[i]);
}

        //n_ptr points to entire array.
n_ptr = &arr;
printf("*n_ptr is %p\n",*n_ptr);
printf("**n_ptr is %d\n",**n_ptr);
for(i=0; i < len; i++) {
printf("*(*n_ptr+i) is %d\n",*(*n_ptr+i));
}

//one pointer points to first address of array arr.
int *ptr=arr; 
*(ptr++)+=123;
printf("*ptr is %d,*(++ptr) is %d\n", *ptr, *(++ptr));
return 0;
}


//p32执行结果如下图所示:


明白数组arr与&arr的区别;

函数参数的执行顺序:从右往左。


1.3 类型转换

例题1

int main() {
unsigned int a = 0xfffffff7;
printf("a: %p\n", &a);


        // char type conversion.
unsigned char i = (unsigned char)a;


//detail explation is following lines. just pointer conversion(not type conversion).
char* b = (char*)&a;
printf("b: %p\n", b);
printf("b+1: %p\n", b+1);


//following six lines is the same as above one line.
unsigned int *p = &a;
printf("p: %p\n", p);
printf("p+1: %p\n", p+1);
char *c = (char *)p;
printf("c: %p\n", c);
printf("c+1: %p\n", c+1);


printf("i: %08x, *b: %08x", i, *b);
return 0;
}



输出结果如下所示:


//P34 主要是变量的类型转换与指针类型转换的区别:变量的类型转换可能会发生字节截断现象;指针的类型转换只会影响指针的寻址,即下一个指针所指向的地址的不同,不会影响其值。如当指针p为Int型,p+1为向后移动4个字节(int所占的空间);当指针P被强制转换为char类型时,p+1为向后移动1个字节(char所占的空间)。

例题2



int main(){

float a = 1.0f;
printf("(int)a: %d\n", (int)a);
printf("&a: %p\n", &a);
printf("(int &)a: %p\n", (int &)a);

float b = 0.0f;
printf("(int)b: %d\n", (int)b);
printf("&b: %p\n", &b);
printf("(int &)b: %p\n", (int &)b);


return 0;
}

//detail sees the website: http://www.cnblogs.com/from20100719/articles/1845238.html?ADUIN=598235904&ADSESSION=1416051763&ADTAG=CLIENT.QQ.5365_.0&ADPUBNO=26405



1.4 运算符问题

例题1:判断一个数是否是2的N次方

int main() {
int x = 0;
scanf("%d", &x);
if (!(x&(x-1))) {
printf("input data is 2^N.\n");
}
else {
printf("input data is not 2^N.\n");
}
return 0;
}

例题2

int f(int x, int y) {
return(x&y)+((x^y)>>1);
}
int main() {
int x = 0, y = 0, z = 0;
scanf("%d%d", &x, &y);
z = f(x, y);
printf("z: %d\n", z);
return 0;
}


1.5 a b 交换

例题1:找出两个数之间比较大的那个数:

#include <math.h>
int main() {
int x = 0, y = 0, max = 0;
scanf("%d%d", &x, &y);
max = ((x+y)+abs(x-y))/2;
printf("max: %d\n", max);
return 0;
}


例题2:a b 值交换,不使用中间变量

int main(){
int x = 0, y = 0;
scanf("%d%d", &x, &y);
printf("x= %d, y = %d\n", x, y);
x = x^y;
y = x^y;
x = x^y;
printf("x= %d, y = %d\n", x, y);
return 0;
}









0 0