intmain() { //&--按2进制位与 int a = 3;//00000000 00000000 00000000 00000011 int b = 5;//00000000 00000000 00000000 00000101 int c = a&b;//00000000 00000000 00000000 00000001=>1 printf("c=%d\n", c);//c=2
intmain() { // |--按2进制位或 int a = 3;//00000000 00000000 00000000 00000011 int b = 5;//00000000 00000000 00000000 00000101 int c = a|b;//00000000 00000000 00000000 00000111 printf("c=%d\n", c);//c=7
intmain() { // |--按2进制异或 int a = 3;//00000000 00000000 00000000 00000011 int b = 5;//00000000 00000000 00000000 00000101 int c = a^b;//00000000 00000000 00000000 00000110 printf("c=%d\n", c);//c=6
//方法1 intmain() { int num = 0; int count = 0; printf("请输入一个整数:>\n"); scanf("%d",&num); //统计num的补码中有几个1 while (num) { if (num%2==1) { count++; } num = num / 2; } printf("count=%d\n",count);
//方法2 //num&1 == 1 =>最低位一定为1 intmain() { int num = 0;//输入值初始化 int count = 0;//计数初始化 int i = 0; printf("请输入一个整数:>\n"); scanf("%d", &num); for (i = 0; i < 32; i++) { if (1 == ((num >> i) & 1)) { count++; } } printf("count=%d\n", count);
//方法3: intmain() { int num = 0; int i = 0; int count = 0;//计数 printf("请输入一个整数:>\n"); scanf("%d", &num); while (num) { count++; num = num&(num - 1); } printf("二进制中1的个数 = %d\n", count); return0; }
intmain(){ //赋值操作符可以连续使用,比如: int a = 10; int x = 0; int y = 20; a = x = y + 1;//连续赋值 //这样的代码感觉怎么样? //那同样的语义,你看看: x = y + 1; a = x; //这样的写法是不是更加清晰爽朗而且易于调试。 return0; }
//前置++和-- #include<stdio.h> intmain() { int a = 10; int x = ++a; //先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。x为11。 int y = --a; //先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值。y为10; return0; }
//后置++和-- #include<stdio.h> intmain() { int a = 10; int x = a++; //先对a先使用,再增加,这样x的值是10;之后a变成11; int y = a--; //先对a先使用,再自减,这样y的值是11;之后a变成10; return0; }
#include<stdio.h> intmain() { int i = 0, a = 0, b = 2, c = 3, d = 4; i = a++ && ++b && d++; //a++先使用后++,所以先为0,后面不计算,之后自增为1 printf(" a = %d\n b = %d\n c = %d\n d = %d\n i = %d\n", a, b, c, d, i); return0; }
intmain() { int i = 0, a = 1, b = 2, c = 3, d = 4; //a++为真,后面逻辑或都不会进行计算,a自增1为2 i = a++ || ++b || d++; printf(" a = %d\n b = %d\n c = %d\n d = %d\n i = %d\n", a, b, c, d, i); return0; }
条件操作符/三目操作符
1
exp1 ? exp2 : exp3
问号前面的条件表达式的部分是要测试的条件。
这就像 if 语句的括号中的表达式。如果条件是真的,则执行 ? 和 : 之间的语句;否则,执行 : 之后的部分。如果认为有帮助,可以在子表达式周围放置圆括号。 如下所示:
1
(x < 0) ? (y = 10) : (Z = 20);
练习
1 2 3 4 5 6 7 8
1. if (a > 5) b = 3; else b = -3; //转换成条件表达式,是什么样?
//代码例1 intmain() { int a = 1; int b = 2; //括号内的a > b,a不产生值 //a = b + 10 = 12 //b = a+1 = 13 //c = b = 13 int c = (a > b, a = b + 10, a, b = a + 1); printf("%d\n", c); return0; }
//代码例2 intmain() { int a = 1; int b = 2; int c = -1; int d = 0; if (a = b + 1, c = a / 2, d > 0) printf("判断为真,则输出此句\n");//d > 0条件为假,不能输出此句 return0; }
//代码例3--伪代码实例 a = get_val(); count_val(a); while (a > 0) { //业务处理 a = get_val(); count_val(a); }
//如果使用逗号表达式,改写: while (a = get_val(), count_val(a), a>0) { //业务处理 }
//实例1 intmain() { char a = 0xb6; short b = 0xb600; int c = 0xb6000000; if (a == 0xb6) printf("a\n"); if (b == 0xb600) printf("b\n"); if (c == 0xb6000000) printf("c\n"); return0; } //程序输出--c
实例1中的a, b要进行整形提升, 但是c不需要整形提升 a, b整形提升之后, 变成了负数, 所以表达式a == 0xb6, b == 0xb600 的结果是假, 但是c不发生整形提升, 则表达式c == 0xb6000000 的结果是真.