【C语言】一文搞懂C语言中的|、||、&、&& àì夳堔傛蜴生んèń 2024-03-17 12:31 3阅读 0赞 **目录** | || & && 示例代码 输出结果 解释 -------------------- ## | ## 在C语言中,|是按位或运算符,用于对两个操作数的每个对应位执行逻辑或操作。它将两个操作数的对应位进行逻辑或运算,并返回结果。按位或运算符只能用于整数类型的操作数。 unsigned int a = 5; // 二进制表示为:00000101 unsigned int b = 3; // 二进制表示为:00000011 unsigned int result = a | b; // 二进制结果为:00000111,十进制结果为:7 int x = 10; // 二进制表示为:00001010 int y = 6; // 二进制表示为:00000110 int result = x | y; // 二进制结果为:00001110,十进制结果为:14 ## || ## 在C语言中,||是逻辑或运算符,用于判断两个表达式的逻辑或关系。它要求两个表达式中至少有一个为真(非零),则返回真(非零)值;如果两个表达式都为假(0),则返回假(0)值。||逻辑或运算符通常用于条件语句或逻辑表达式中。 int a = 5; int b = 10; if (a > 0 || b > 0) { // 当a或b中至少有一个大于0时,执行此代码块 } 在上述示例中,'||'符号用于判断两个表达式的逻辑或关系,如果a或b中至少有一个大于0,则执行if语句块内的代码。需要注意的是,在使用逻辑或运算符||时,如果第一个表达式已经为真,则不再计算和评估第二个表达式,因为只需要其中一个表达式为真就会返回真值。这种行为被称为"短路求值"。 ## & ## 在C语言中,& 是按位与运算符和取地址运算符。1. 按位与运算符:& 用于对两个操作数的每个对应位执行按位与操作。它将两个操作数的每个对应位进行逻辑与运算,并返回结果。 unsigned int a = 5; // 二进制表示为:00000101 unsigned int b = 3; // 二进制表示为:00000011 unsigned int result = a & b; // 二进制结果为:00000001,十进制结果为:1 int x = 10; // 二进制表示为:00001010 int y = 6; // 二进制表示为:00000110 int result = x & y; // 二进制结果为:00000010,十进制结果为:2 通过按位与运算符 & 对两个操作数的对应位进行逻辑与运算,并返回结果。 2. 取地址运算符:& 用于获取变量的内存地址。它可以应用于任何变量或数组,并返回变量的地址。 int num = 10; int* ptr = # // 取得 num 的地址,并将其赋值给指针 ptr 通过取地址运算符 & 可以获得变量 num 的内存地址,并将其赋值给指针 ptr。 ## && ## 在C语言中,&& 是逻辑与运算符。它用于判断两个表达式的逻辑与关系。只有当两个表达式都为真(非零)时,表达式的结果才会为真(非零)。&& 逻辑与运算符通常用于条件语句或逻辑表达式中。 int a = 5; int b = 10; if (a > 0 && b > 0) { // 当a和b都大于0时,执行此代码块 } 在上述示例中,'&&'符号用于判断两个表达式的逻辑与关系。只有当a和b都大于0时,if语句块内的代码才会执行。需要注意的是,在使用逻辑与运算符&&时,如果第一个表达式已经为假(0),则不再计算和评估第二个表达式,因为只有两个表达式都为真时,整个表达式才会为真。这种行为被称为"短路求值"。 ## 示例代码 ## #include <iostream> int main() { int x,y,z;//定义变量 x = y = 10;//变量赋值 z = ++x || ++y;//或逻辑运算,编辑器代码优化,只要判断前面一个条件为真,则输出为真,后面条件不再运算 printf("x=%d\ty=%d\tz=%d\n", x,y,z);//控制台输出结果 //输出的结果为x=11 y=10 z=1 int X, Y, Z; X = Y = 10; Z = ++X | ++Y;//按位或的操作,++X为11,二进制为00001011,同理++Y也是00001011,按位或得到00001011,即十进制11 printf("X=%d\tY=%d\tZ=%d\n",X,Y,Z); //输出结果为X=11 Y=11 Z=11 int a, b, c;//定义变量 a = b = 10;//变量赋值 c = ++a && ++b;//与逻辑运算,要判断两个条件都为真才为真,所以两个条件都进行运算 printf("a=%d\tb=%d\tc=%d\n", a, b, c);//控制台输出结果 //输出结果为a=11 b=11 c=1 int A, B, C; A = B = 10; C = ++A & ++B;//按位与运算,与上面或运算同理 printf("A=%d\tB=%d\tC=%d\n", A, B, C); //输出结果为A=11 B=11 C=11 int i, j; i = j = 10; if(i++||j++)//使用||进行逻辑运算,前面条件为真不再进行后面的运算 printf("i=%d\tj=%d\t\n", i, j); //输出结果为i=11 j=10 int I,J; I = J = 10; if (I++ | J++)//使用|进行逻辑运算,前面条件为真,后面的条件继续运行 printf("I=%d\tJ=%d\t\n", I, J); //输出结果为I=11 J=11 return 0; } ## 输出结果 ## x=11 y=10 z=1 X=11 Y=11 Z=11 a=11 b=11 c=1 A=11 B=11 C=11 i=11 j=10 I=11 J=11 ## 解释 ## * 第一组输出(x=11,y=10,z=1)是因为在执行 \`z = ++x || ++y\` 时,++x 的结果为 11,由于前面的条件已经为真(非零),所以不再执行 ++y。因此,x 变为 11,y 保持不变,z的值为1(真)。 * 第二组输出(X=11,Y=11,Z=11)是因为在执行 \`Z = ++X | ++Y\` 时,++X 和 ++Y 的结果都为 11。按位或运算会对每个位进行逻辑或操作,所以结果为 11(二进制表示为 00001011,十进制表示为 11)。 * 第三组输出(a=11,b=11,c=1)是因为在执行 \`c = ++a && ++b\` 时,++a 和 ++b 都会被执行。而逻辑与运算符 && 需要判断两个条件都为真才为真,所以两个条件都会进行运算。因此,a 和 b 的值都变为 11,c 的值为 1(真)。 * 第四组输出(A=11,B=11,C=11)是因为在执行 \`C = ++A & ++B\` 时,++A 和 ++B 都会被执行。按位与运算符 & 对每个位进行逻辑与操作,所以结果为 11(二进制表示为 00001011,十进制表示为 11)。 * 第五组输出(i=11,j=10)是因为在条件语句 \`if(i++||j++)\` 中,初始值 i 和 j 都为 10。++i 操作会先将 i 的值加 1,并且条件表达式 \`i++\` 中的后缀递增运算符会使得条件判断里面的 i 的值为 11。而 || 运算符在前一个条件为真时不再运算后面的条件,所以 j 的值不会递增。因此,i 的值为 11,j 的值保持为 10。 * 第六组输出(I=11,J=11)是因为在条件语句 \`if (I++ | J++)\` 中,初始值 I 和 J 都为 10。++I 是前缀递增运算符,会先将 I 的值加 1,所以条件判断里面的 I 的值为 11。而 | 运算符会对每个位进行逻辑或操作,所以结果为 11(二进制表示为 00001011,十进制表示为 11)。同时,J 的值也会递增。因此,I 和 J 的值都为 11。
还没有评论,来说两句吧...