标准C知识03

来源:互联网 发布:上海贝格数据怎么样 编辑:程序博客网 时间:2024/05/22 04:05
位运算符可以直接对二进制数据进行计算。
|(按位或),&(按位与)和^(按位异或)是三个双目位运算符。进行位运算时不把参与计算的数字看成一个整体,只关心数字的每个二进制数位应该如何处理。
|运算符把对应数位上的数字进行或计算。按位或用于把二进制数字中的某些数位设置成1。
&运算符把对应数位上的数字进行与运算。按位与可以把一个数字的某个数位设置成0,也可以用于提取某些数位。
^运算符把对应数位上的数字进行异或操作。如果两个数字相同则结果为0,否则结果为1.
单目位运算符~,表示按位取反。它可以把一个数字的每个数位变成相反数。

<<(左移)和>>(右移)也是位运算符,他们可以把一个二进制数字向左或向右移动指定的位数。
左移n位计算过程是把最高n位取消,然后再低位补上n个0。
相当于数字乘以2的多少次方(在不损失有效数据的前提下)
右移n位就把最低n位取消,然后在高位补充n个符号位(对有符号数)。相当于除以2的n次方。

&表示取地址符号,*表示通过地址取得变量的符号

三目运算符可以基于一个逻辑表达式从两个结果中选择一个结果。语法如下
(逻辑表达式) ? (结果1) : (结果2)
如果逻辑表达式结果为真则选择结果1,否则选择结果2。

C语言中可以把任何一个变量当成任何类型数字来使用,这叫做强制类型转换。

如果一个表达式中涉及的数据类型不一样,则计算机会首先把他们调整成类型一样,然后再进行计算。这叫做隐形类型转换。

if语句可以用来在程序中实现分支处理,语法如下
if (逻辑表达式1) {    //最多一次
    逻辑表达式1成立时的处理代码
}
else if (逻辑表达式2) {   //可以没有也可以任意多个
    逻辑表达式2成立时的处理代码
}
else {      //可以没有,最多一次
    前面所有逻辑表达式都不成立时的处理代码
}
这种写法表示多个分支互相对立(只能有一个成立)。如果有最后的else分支则他们互补(总有一个成立)

switch...case语句也可以用来实现分支处理。具体语法参考练习。

C语言中可以使用循环语句控制一段代码反复执行,for语句是一种循环语句。for语句格式如下
for (1;2;3) {
    4     //需要反复执行的代码
}
这段代码的执行顺序如下
[1, 2] [4, 3, 2] [4, 3, 2] [4, 3, 2]
除了第一组以外后面所有组的执行顺序是一样的
一般情况下都是某一组完整执行后整个过程结束
每一组都是以编号为2的代码最为结尾的
for语句可以参照下面的模版编写
int xun_huan = 0;
for (xun_huan = 0; xun_huan < 次数; xun_huan++) {
    处理代码
}
其中次数表示希望处理代码反复执行的次数
以上模版可以让处理代码反复执行指定的次数

在循环中可以使用break;语句立刻结束整个循环的执行。如果循环中使用了这条语句则会导致在某一组的执行过程中第一阶段就结束整个循环。

continue;语句与break;类似,它可以把某一组的第一个步骤立刻结束。


/*
    位运算练习
*/
#include <stdio.h>
int main() {
    int shu_zi = 0, shu_zi_1 = 0;
    printf("3 | 5是%d\n", 3 | 5);   //7
    printf("3 & 5是%d\n", 3 & 5);   //1
    printf("3 ^ 5是%d\n", 3 ^ 5);   //6
    printf("请输入两个数字:");
    //使用按位异或完成两个变量中数字的交换
    /*scanf("%d %d", &shu_zi, &shu_zi_1);
    shu_zi ^= shu_zi_1;
    shu_zi_1 ^= shu_zi;
    shu_zi ^= shu_zi_1;
    printf("shu_zi是%d,shu_zi_1是%d\n", shu_zi, shu_zi_1);*/
    printf("~3是0x%x\n", ~3);    //0xfc
    printf("3 << 2是0x%x\n", 3 << 2);   //0xc
    printf("-12 >> 2是0x%x\n", -12 >> 2);  //0xfd
    printf("12 >> 2是0x%x\n", 12 >> 2);    //0x3
    return 0;
}


/*
    地址相关操作符练习
*/
#include <stdio.h>
int main() {
    int shu_zi = 0;
    printf("&shu_zi是%p\n", &shu_zi);
    printf("*(&shu_zi)是%d\n", *(&shu_zi));
    return 0;
}

/*
     三目运算符练习
*/
#include <stdio.h>
int main() {
    char zi_fu = 0;
    printf("请输入一个字符:");
    scanf("%c", &zi_fu);
    zi_fu = (zi_fu >= 'a' && zi_fu <= 'z') ? (zi_fu - 'a' + 'A') : (zi_fu - 'A' + 'a');
    printf("转换结果是%c\n", zi_fu);
    return 0;
}

/*
    类型转换练习
*/
#include <stdio.h>
int main() {
    int shu_zi = -6;
    printf("%d\n", shu_zi - 5);
    printf("%u\n", (unsigned int)shu_zi - 5);  //强制把变量shu_zi转换成unsigned int类型
    printf("大小是%d\n", sizeof(3 < 5 ? 1 : 0.9));  //因为0.9是double类型,所以整数1也被隐形类型转换成double类型,计算结果是8.
    return 0;
}

/*
    if练习
*/
#include <stdio.h>
int main() {
    int shu_zi = 0, shu_zi_1 = 0;
    printf("请输入两个数字:");
    scanf("%d %d", &shu_zi, &shu_zi_1);
    if (shu_zi > 0) {
        if (shu_zi_1 > 0) {
            printf("结果是%d\n", shu_zi - shu_zi_1);
        }
        else if (shu_zi_1 < 0) {
            printf("火车票不能为负。\n");
        }
        else {
            printf("火车票不能为0\n");
        }
    }
    else if (shu_zi < 0) {
        printf("飞机票价格必须大于0\n");
    }
    else {
        printf("飞机票价格不可以是0\n");
    }
    return 0;
}

/*
     计算闰年的练习
*/
#include <stdio.h>
int main() {
    int nian = 0;
    printf("请输入年份:");
    scanf("%d", &nian);
    //三个分支
    /*if (!(nian % 4) && (nian % 100)) {
        printf("%d年是闰年\n", nian);
    }
    else if (!(nian % 400)) {
        printf("%d年是闰年\n", nian);
    }
    else {
        printf("%d年不是闰年\n", nian);
    }*/
    if ((!(nian % 4) && (nian % 100)) || !(nian % 400)) {
        printf("%d年是闰年\n", nian);
    }
    else {
        printf("%d年不是闰年\n", nian);
    }
    return 0;
}
/*
    季节练习
*/
#include <stdio.h>
int main() {
    char zi_fu = 0;
    printf("请输入一个字符:");
    scanf("%c", &zi_fu);
    /*if ('0' == zi_fu) {
        printf("%d\n", 0);
    }
    else if ('1' == zi_fu) {
        printf("%d\n", 1);
    }
    else if ('a' == zi_fu) {
        printf("%d\n", 10);
    }
    else if ('A' == zi_fu) {
        printf("%d\n", 10);
    }*/
    switch (zi_fu) {   //对zi_fu变量的取值进行分支处理。小括号内可以是一个表达式,只要计算结果是整数就可以
    case '0':     //zi_fu变量取值为'0'时从这行开始执行处理代码
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
        printf("%d\n", zi_fu - '0');
        break;     //前面的处理代码到这里将结束
    case 'a' ... 'f':   //zi_fu变量的取值在'a'到'f'之间
        printf("%d\n", zi_fu - 'a' + 10);
        break;
    case 'A' ... 'F':
        printf("%d\n", zi_fu - 'A' + 10);
        break;
    default:    //所有没有列出的取值将从这里开始执行处理代码
        printf("无效字符\n");
        break;
    }
    return 0;
}


/*
    字符大小写转换练习
*/
#include <stdio.h>
int main() {
    char zi_fu = 0;
    printf("请输入一个字符:");
    scanf("%c", &zi_fu);
    switch(zi_fu) {
    case 'a' ... 'z':
        printf("转换结果是%c\n", zi_fu - 'a' + 'A');
        break;
    case 'A' ... 'Z':
        printf("转换结果是%c\n", zi_fu - 'A' + 'a');
        break;
    default:
        printf("无效字符\n");
        break;
    }
    return 0;
}

/*
    for练习
*/
#include <stdio.h>
int main() {
    int shu_zi = 0, shu_zi_1 = 0, xun_huan = 0;
    for (xun_huan = 0;xun_huan < 3;xun_huan++) {
        printf("请输入两个数字:");
        scanf("%d %d", &shu_zi, &shu_zi_1);
        if (shu_zi <= 0) {
            continue;    //可以把后面的语句都跳过
        }
        if (shu_zi_1 > 0) {
            printf("结果是%d\n", shu_zi - shu_zi_1);
            break;   //立刻结束整个循环的执行
        }
    }
    return 0;
}










原创粉丝点击