C语言基础(二)

1、算术运算符:

测试代码1:

#include <stdio.h>  
int main() {  
    char c = 'A'; // ASCII 值为 65  
    int i = 10;  
    float f = 3.14;  
    double d = c + i + f; // c 被提升为 int,然后与 i 相加,结果再与 f 相加(f 被提升为 double)  
    printf("d = %f\n", d); // 输出 d 的值,d 是 double 类型  
    int result = (int)d; // 显式地将 double 类型的 d 转换为 int 类型的 result  
    printf("result = %d\n", result); // 输出 result 的值,会发生精度丢失  
    return 0;  
}

运行结果如下:

 

测试代码2:

#include <stdio.h>   
#include <cmath> 
int main() {  
    // int 类型  
    int intA = 10, intB = 5;  
    printf("int 加法: %d + %d = %d\n", intA, intB, intA + intB);  
    printf("int 减法: %d - %d = %d\n", intA, intB, intA - intB);  
    printf("int 乘法: %d * %d = %d\n", intA, intB, intA * intB);  
    printf("int 除法: %d / %d = %d\n", intA, intB, intA / intB); // 结果是整数  
    printf("int 取余: %d %% %d = %d\n", intA, intB, intA % intB);  
  
    // float 类型  
    float floatA = 10.5f, floatB = 4.2f;  
    printf("float 加法: %.2f + %.2f = %.2f\n", floatA, floatB, floatA + floatB);  
    printf("float 减法: %.2f - %.2f = %.2f\n", floatA, floatB, floatA - floatB);  
    printf("float 乘法: %.2f * %.2f = %.2f\n", floatA, floatB, floatA * floatB);  
    printf("float 除法: %.2f / %.2f = %.2f\n", floatA, floatB, floatA / floatB);  
    // float 类型没有直接的取余运算符,但以通过转换为整数或使用fmod函数  
    printf("float 取余(使用fmod): %.2f %% %.2f = %.2f\n", floatA, floatB, fmod(floatA, floatB));  
    // double 类型  
    double doubleA = 10.5, doubleB = 4.2;  
    printf("double 加法: %.2f + %.2f = %.2f\n", doubleA, doubleB, doubleA + doubleB);  
    printf("double 减法: %.2f - %.2f = %.2f\n", doubleA, doubleB, doubleA - doubleB);  
    printf("double 乘法: %.2f * %.2f = %.2f\n", doubleA, doubleB, doubleA * doubleB);  
    printf("double 除法: %.2f / %.2f = %.2f\n", doubleA, doubleB, doubleA / doubleB);  
    // double 类型同样没有直接的取余运算符,可以使用fmod函数  
    printf("double 取余(使用fmod): %.2f %% %.2f = %.2f\n", doubleA, doubleB, fmod(doubleA, doubleB));  
    return 0;  
}

运行结果如下:

 

........................................................................................................................................................... 

2、关系运算符:

C语言中的关系运算符用于比较两个值之间的关系,并根据比较的结果返回真(非零值,通常是1)或假(零)。在条件判断、循环控制等场景中非常有用。C语言中的关系运算符包括:
等于(==):用于比较两个值是否相等。如果相等,结果为真(1);否则为假(0)。
不等于(!=):用于比较两个值是否不相等。如果不相等,结果为真(1);否则为假(0)。
大于(>):用于比较左侧值是否大于右侧值。如果是,结果为真(1);否则为假(0)。
小于(<):用于比较左侧值是否小于右侧值。如果是,结果为真(1);否则为假(0)。
大于等于(>=):用于比较左侧值是否大于或等于右侧值。如果是,结果为真(1);否则为假(0)。
小于等于(<=):用于比较左侧值是否小于或等于右侧值。如果是,结果为真(1);否则为假(0)。
关系运算符主要用于条件语句(如if语句)中,以及循环语句(如while、for)的条件表达式中,以控制程序的流程。

#include <stdio.h>  
int main() {  
    int num1 = 10;  
    int num2 = 20;  
  
    // 等于(==)  
    if (num1 == num2) {  
        printf("%d is equal to %d\n", num1, num2);  
    } else {  
        printf("%d is not equal to %d\n", num1, num2);  
    }  
  
    // 不等于(!=)  
    if (num1 != num2) {  
        printf("%d is not equal to %d\n", num1, num2); 
    }  
  
    // 大于(>)  
    if (num1 > num2) {  
        printf("%d is greater than %d\n", num1, num2);  
    } else {  
        printf("%d is not greater than %d\n", num1, num2);  
    }  
  
    // 小于(<)  
    if (num1 < num2) {  
        printf("%d is less than %d\n", num1, num2);  
    } else {  
        printf("%d is not less than %d\n", num1, num2);  
    }  
  
    // 大于等于(>=)  
    if (num1 >= num2) {  
        printf("%d is greater than or equal to %d\n", num1, num2); // 不会打印,因为num1 < num2  
    } else {  
        printf("%d is not greater than or equal to %d\n", num1, num2);  
    }  
  
    // 小于等于(<=)  
    if (num1 <= num2) {  
        printf("%d is less than or equal to %d\n", num1, num2);  
    } else {  
        printf("%d is not less than or equal to %d\n", num1, num2);  
    }  
  
    return 0;  
}

运行结果如下:

 

........................................................................................................................................................... 

3、逻辑运算符:

C语言中的逻辑运算符用于根据两个或多个表达式的值来返回真(非零)或假(零)。通常用于条件语句中,控制程序的流程。三种基本的逻辑运算符:逻辑与(AND)、逻辑或(OR)和逻辑非(NOT)。

逻辑非(!):一元运算符,用于对其后的表达式的值取反。如果表达式的值为真(非零),则逻辑非运算符返回假(0);如果表达式的值为假(0),则返回真(1)。


逻辑与(&&):二元运算符,用于判断其两个操作数是否都为真。只有当两个操作数都为真时,结果才为真(1);否则为假(0)。


逻辑或(||):二元运算符,用于判断其两个操作数中是否至少有一个为真。如果两个操作数中至少有一个为真,则结果为真(1);只有当两个操作数都为假时,结果才为假(0)。

逻辑运算符的短路行为:


逻辑与(&&):如果第一个操作数为假(0),则整个表达式的值就已经确定为假,此时不会评估第二个操作数,称为“短路”。


逻辑或(||):如果第一个操作数为真(非零),则整个表达式的值就已经确定为真,此时不会评估第二个操作数,同样称“短路”。

测试代码1:

#include <stdio.h>   
int main() {  
    int a = 5, b = 10, c = 15;  
    if (a > b && c > b) {  
        printf("Both conditions are true\n");  
    } else {  
        printf("At least one condition is false\n"); //  a > b 假 
    }  
    if (a < b || c < b) {  
        printf("At least one condition is true\n"); //  a < b 真
    }  
    if (!(a == b)) {  
        printf("a is not equal to b\n"); //  !(a == b) 真 
    }  
    return 0;  
}

运行结果如下:

 

测试代码2:

#include <stdio.h>  
#include <stdbool.h> 
// 逻辑非(NOT)  
bool logicalNot(int value) {  
    return !value;  
}    
// 逻辑与(AND)
bool logicalAnd(int a, int b) {  
    return a && b;  
}   
// 逻辑或(OR)
bool logicalOr(int a, int b) {  
    return a || b;  
}   
// float和char类型的包装函数,内部转换为int处理  
bool logicalAndFloat(float a, float b) {  
    return logicalAnd((int)a, (int)b); 
}  
bool logicalOrChar(char a, char b) {  
    return logicalOr((int)a, (int)b); // 字符被隐式转换为ASCII值  
}  
int main() {  
    int intA = 0, intB = 5;  
    float floatA = 0.0f, floatB = 5.0f;  
    char charA = 'A', charB = '5'; // 使用字符的ASCII值进行比较  
    printf("logicalNot(intA): %d\n", logicalNot(intA)); 
    printf("logicalAnd(intA, intB): %d\n", logicalAnd(intA, intB)); 
    printf("logicalOr(intA, intB): %d\n", logicalOr(intA, intB));
    printf("logicalAndFloat(floatA, floatB): %d\n", logicalAndFloat(floatA, floatB)); 
    printf("logicalOrChar(charA, charB): %d\n", logicalOrChar(charA, charB)); 
    return 0;  
}

运行结果如下:

 

.......................................................................................................................................................

4、位运算符: 

位运算符对整数类型的位模式进行操作。在底层编程、硬件接口、图形处理、加密算法等领域非常有用。常用的位运算符及其说明:

按位与(AND)运算符 &
对两个数的二进制表示进行逐位与操作。只有当两个相应的位都为1时,结果位才为1,否则为0。

按位或(OR)运算符 |
对两个数的二进制表示进行逐位或操作。只要两个相应的位中有一个为1,结果位就为1。

按位异或(XOR)运算符 ^
对两个数的二进制表示进行逐位异或操作。当两个相应的位不相同时,结果位为1;相同时,结果位为0。

按位取反(NOT)运算符 ~
对一个数的二进制表示进行逐位取反操作。即0变为1,1变为0。
结果通常是一个补码表示的数,直接用于正数时,结果将是负数。

左移(Shift Left)运算符 <<
将一个数的二进制表示向左移动指定的位数,右边超出的位被丢弃,左边超出的部分用0填充。

右移(Shift Right)运算符 >>
将一个数的二进制表示向右移动指定的位数。对于有符号整数,左边超出的部分用符号位填充(即算术右移);
对于无符号整数,左边超出的部分用0填充(即逻辑右移)。无符号整数和有符号整数的右移操作,其行为可能有所不同,取决于编译器和平台。
 

测试代码:

#include <stdio.h>  
int main() {  
    // 按位与(AND)运算符 &  
    unsigned int a1 = 12;  // 0000 1100  
    unsigned int b1 = 9;   // 0000 1001  
    unsigned int c1 = a1 & b1;  
    printf("%u & %u = %u\n", a1, b1, c1); 
    // 按位或(OR)运算符 |  
    unsigned int a2 = 12;  // 0000 1100  
    unsigned int b2 = 9;   // 0000 1001  
    unsigned int c2 = a2 | b2;  
    printf("%u | %u = %u\n", a2, b2, c2); 
    // 按位异或(XOR)运算符 ^  
    unsigned int a3 = 12;  // 0000 1100  
    unsigned int b3 = 9;   // 0000 1001  
    unsigned int c3 = a3 ^ b3;  
    printf("%u ^ %u = %u\n", a3, b3, c3); 
    // 按位取反(NOT)运算符 ~  
    // 按位取反的结果通常用十六进制或二进制表示
    unsigned int a4 = 12; 
    unsigned int c4 = ~a4;  
    printf("~%X = %X\n", a4, c4);  

    // 左移(Shift Left)运算符 <<  
    unsigned int a5 = 4;  // 0000 0100  
    unsigned int c5 = a5 << 2;  
    printf("%u << 2 = %u\n", a5, c5); 
    
	// 右移(Shift Right)运算符 >>  
    // 无符号整数,右移  
    unsigned int a6 = 16;  // 0001 0000  
    unsigned int c6 = a6 >> 2;  
    printf("%u >> 2 = %u\n", a6, c6);  
    // 有符号整数右移动 
    int num = -4; // -4的二进制表示为 11111111 11111111 11111111 11111100 (32位) 
    int shifted = num >> 1;
    // 打印结果  
    printf("Original: %d\n", num);  
    printf("Shifted : %d\n", shifted);  
  
    return 0;  
}

运行结果如下:

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值