程序设计基本概念

/***********************************《程序员面试宝典》第二版笔记*******************************************/

赋值语句

1.what does the following program print?
#include <stdio.h>

int main()
{
	int x=2,y,z;
	x *= (y=z=5); //5赋值给z再赋值给y, x = x*5 =10;
	printf("x=%d\n", x);

	z = 3;
	x == (y=z);//z赋值给y,然后看x和y是否相等,不管相等否,x没有变化为10
	printf("x=%d\n", x);
	
	x = (y==z);//y==z返回布尔值1,赋值给x,x=1
	printf("x=%d\n", x);

	x = (y&z);//y和z=3按位与,结果为3赋给x
	printf("x=%d\n", x);

	x= (y&&z);//y和z进行逻辑与,结果为1赋给x
	printf("x=%d\n", x);
	
	y = 4;
	x=(y | z);//y=4, z=3按位或,结果为7赋给x
	printf("x=%d\n", x);

	x=(y || z);//y和z逻辑或,结果为1赋给x
	printf("x=%d\n", x);
	return 0;
}
10 10 1 3 7 1

2. what does the following program print?
全局变量和局部变量同名的引用加::
#include <iostream>
using namespace std;

int Val = 3;

int main()
{
	int Val = 10;
	::Val++;//引用全局变量加1后为4
	cout<<::Val<<endl;//输出全局变量值为4
	cout<<Val <<endl;//输出局部变量值为10

	return 0;
}
4 10

i++

3. What will be output of the followint C code?
#include <stdio.h>
main()
{
	int b =3;
	int arr[] = {6, 7, 8, 9, 10};
	int *ptr = arr;//ptr指向第一个元素6
	*(ptr++) += 123;//ptr++指向第二个元素7,此时*ptr=7
	//C中printf计算参数时是从右到左压栈的
	//++ptr指向8
	printf("%d, %d\n", *ptr, *(++ptr));
}
输出 8 8

类型转换

4. 下面程序的结果是多少?
#include <stdio.h>
main()
{
	unsigned char a = 0xA5;
	//编译器会将a和4的值转换为int型后在计算,计算结果转换成unsigned char赋给b
	//因为">>"的优先级高于"~"
	//0xA5 1010 0101 先右移四位0000 1010,再取反 1111 0101 结果为0xF5转换成
	//十进制输出为245
	unsigned char b = ~a >> 4;

	printf("b=%d\n", b);

	return 0;
}
输出245

5.下面程序的结果是多少?
#include <stdio.h>

int main()
{
	unsigned int a= 0xFFFFFFF7;
	//unsigned int变量赋值给unsigned char变量时会发生字节截断(3位和高于3位的将被程序自动丢弃)
	unsigned char i = (unsigned char)a;//输出000000f7
	//&a的结果是一个指针,b指向a(强制转换)
	char *b = (char*)&a;//输出fffffff7
	
	printf("%08x, %08x", i, *b);
}

与非问题

6. 用一个表达式,判断一个数X是否是2的N次方(2, 4, 8,16),不可用循环语句
解析:2,4,8,16这样的数转化成二进抽是10,100,1000,10000,如果X减1后与X做与运算
答案若是0,则X是2N次方
答案:!(X&(X-1))

7. 下面程序的结果是多少?
#include <stdio.h>

int main()
{
	int count = 0;
	int m = 9999;
	while(m) {
		count ++;
		m = m &(m-1);
	}
	printf("count=%d\n", count);
}
答案:8,本题的解法是把m转换成二进制,输出为这个二进制中1的个数
1001 1001 1001 1001

a, b 交换
8. There are two int variables: a and b, don't use "if", "?", "switch" or other judgement
statements, find out the biggest one of the two numbers.
两个变量a和b,不用if,?,switch或其他判断语句,找出两个数中间比较大的
答案: int max = ((a + b) + abs(a - b)) / 2

9. 如何将a,b的值进行交换,并且不使用任何中间变量?
答:1) a = a+b;
		b = a-b;
		a = a-b;
		当a,b都是比较大的两个数,a = a+b时就会超界
	2) a = a^b;
	   b = a^b;
	   a = a^b;
	   不用担心越界问题
	   
C 和 C++ 的关系
10. 在C++程序中调用被C编译器编译后的函数,为什么要加extern "C"
答:C++支持函数重载,C不支持,C++提供了C连结交换指定符号extern "C" 解决名字匹配问题

11. 头文件中的ifndef/define/endif是做什么用的?
答: 防止该头文件被重复引用


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值