C语言重点知识复习1

1.进制之间的转换
%d 十进制输出
%0x 十六进制输出
%08x 十六进制输出,输出8位,如果不够,补0

编程题:将十进制的数字转换成n进制的数字

#include <iostream>
#include <stack>
using namespace std;

//使用stack,将得到的数字压栈,最后逐一出栈
void MyTenToN1(int num, int n)//n表示进制
{
    if(num < 0)
        return;
    else if(0 == num)
    {
        cout<<"0"<<endl;
        return;
    }
    stack<int> st;

    int i = 0;//余数
    int j = num;//商
    while(j != 0)//商为0是循环结束条件
    {
        i = j % n;
        j = j / n;
        st.push(i);
    }

    while(!st.empty())
    {
        cout<<st.top();
        st.pop();
    }
    cout<<endl;
}

//每次得到最小位的数,乘位的权重
int MyTenToN2(int num, int n)
{
    if(num < 0)
        return -1;
    else if(0 == num)
    {
        cout<<"0"<<endl;
        return -1;
    }

    int i = 0;//余数
    int j = num;//商
    int count = 0;
    int result = 0;
    int pow = 1;

    while(j != 0)
    {
        i = j % n;
        j = j / n;
        ++count;
        if(count != 1)
        {
            pow *= 10;
        }
        result += i*pow;
    }
    return result;
}

int main()
{
    cout<<MyTenToN1(123,2)<<endl;
    cout<<MyTenToN1(123,3)<<endl;
    cout<<MyTenToN1(123,4)<<endl;
    cout<<MyTenToN1(123,5)<<endl;
    cout<<MyTenToN1(123,6)<<endl;
    cout<<MyTenToN1(123,7)<<endl;
    cout<<MyTenToN1(123,8)<<endl;
    cout<<MyTenToN1(123,9)<<endl;

    cout<<MyTenToN2(123,2)<<endl;
    cout<<MyTenToN2(123,3)<<endl;
    cout<<MyTenToN2(123,4)<<endl;
    cout<<MyTenToN2(123,5)<<endl;
    cout<<MyTenToN2(123,6)<<endl;
    cout<<MyTenToN2(123,7)<<endl;
    cout<<MyTenToN2(123,8)<<endl;
    cout<<MyTenToN2(123,9)<<endl;

    return 0;
}

编程题:判断当前字母是否为大写

#include <iostream>
using namespace std;

//由于字母的ASCII码不一定连续,自己构建小写字母连续的数组,进行比较 
//引入头文件#include<ctype.h>    bool islower(int ch);是库函数
bool Myislower(int ch)
{
    int arr[] = {"abcdefghijklmnopqrstuvwxyz"};
    int len = sizeof(arr)/sizeof(arr[0]);
    for(int i=0; i<len-1; ++i)
    {
        if(arr[i] == ch)
        {
            return true;
        }
    }
    return false;
}

int main()
{
    cout<<Myislower('a')<<endl;
    cout<<Myislower('c')<<endl;
    cout<<Myislower('F')<<endl;
    cout<<Myislower('G')<<endl;
    cout<<Myislower('d')<<endl;
    cout<<Myislower('R')<<endl;
    return 0;
}

2.运算符的优先级
(1)/和% 不能除0,不能对0取余,程序会崩溃
(2)%运算符的操作数必须是整数

(3)<<和>>位移运算符
左移,右边补0 右移,左边补符号位 一般先化成二进制再比较

(4)1<2<5 永真 要注意大于小于运算符的连续比较

(5)表达式1 && 表达式2 如果表达式1为假,表达式2不计算 编译器优化
表达式1 || 表达式2 如果表达式1为真,表达式2不计算

3.变量的生存周期
这里写图片描述

4.switch…case 找到匹配的case进;显示的碰到break出
switch不能用float类型的数,float类型的数不能用“==”直接比较
5.宏替换 做题的最好方法:把用到宏的地方都替换一下,重抄代码计算结果
6.类型转换
同类型,无符号的数比有符号的数宽 有符号—->无符号
算数运算时,整型(int)起
无符号左边补0,有符号左边补1
7.面试题:既然do…while能做的事while都可以做,为什么还要设计do…while?
答:(1)辅助定义复杂的宏,防止出现替换错误

#define SOMETHING fun1(); fun2()
if(a < 0)
    SOMETHING;

实则执行:

if(a < 0)
     fun1(); 
fun2();//fun2()始终会被执行

如果使用do…while

#define SOMETHING    do{fun1(); fun2()}while(0)
if(a < 0)
    SOMETHING;

实则执行:

if(a < 0)
    do
    {
         fun1();
         fun2();
    }while(0);

(2)避免空宏引起的warming
内核中由于不同架构的限制,很多时候会用到空宏,在编译的时候,空宏会给出warning,为了避免这样的warning,就可以使用do{}while(0)来定义宏。如:

#define SOMETHING do{}while(0)
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值