C语言短路求值(逻辑与、逻辑或)
逻辑或的短路
首先上代码:1
2
3
4
5
6
7
8
int main() {
int a = 1;
printf("a = %d\n", a);
1 || (a = 0);
printf("a = %d\n", a);
return 0;
}
运行结果如下:
a = 1
a = 1
逻辑或的表现形式如下:expression1 || exexpression2
这⾥用到了逻辑或,由于逻辑或的短路,expression1为true,则后⾯的expression2(即:(a=0) )不再求值,整个表达式的结果为true,所以a的值仍为1,没有改变。【即:一真为真】
逻辑与的短路
⾸先看如下代码:1
2
3
4
5
6
7
8
int main() {
int a = 1;
printf("a = %d\n", a);
0 && (a = 3);
printf("a = %d\n", a);
return 0;
}
运行结果如下:
a = 1
a = 1
逻辑与的表现形式如下:expression1 && expression2
上述代码中用到了逻辑与,由于逻辑与的短路,expression1
为false
,则后面的expression2
不再求值,整个的结果为false
,所以a的值没有改变。【即:一假则假】
Eratosthenes筛选法
算法原理
解释一:
给出要筛选数值的范围$n$,找出sqrt(n)
以内的素数$p_1, p_2, … , p_k$。
- 先把1删除(现今数学界1既不是质数也不是合数)
- 读取队列中当前最小的数2,然后把2的倍数删去
- 读取队列中当前最小的数3,然后把3的倍数删去
- 读取队列中当前最小的数5,然后把5的倍数删去
- 读取队列中当前最小的数7,然后把7的倍数删去
- 不断重复下去…直到需求的范围内所有的数均删除或读取
注:此处的队列并非数据结构队列,如需保留运算结果,处于存储空间的充分利用以及大量删除操作的实施,建议采用链表的数据结构。
【来源:百度百科】
解释二:
- 取最小的数$2$,并声明它是素数,同时筛去它及它的所有倍数;
- 取未筛去的数中的最小者,声明它是素数,同时筛去它及它的所有倍数;
- 重复步骤2,至筛中无数为止,得到所有素数。
筛法实际上是筛去合数,留下素数。
一位数组举例
代码
1 | //C Language |
1 | //C++ |
关于void *
void的含义
void
即“无类型”,void *
则为“无类型指针”,可以指向任何数据类型
void指针的使用规范
void
指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void
指针赋值。例如:1
2
3int *p_int;
void *p_void;
p_void = p_int; /*但是不能 p_int = p_void*/
如果要将p_void
赋给其他类型指针,则需要强制类型转换如:p_int = (int *)p_void;
- 在ANSIC标准中,不允许对
void
指针进行算术运算如p_void++
或p_void += 1
等,而在GNU中则允许。因为在缺省情况下,GNU认为void *
与char *
⼀样。sizeof(*pvoid ) == sizeof(char)
. - 由于
void
指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void
指针赋值,因此还可以用void
指针来作为函数形参,这样函数就可以接受任意数据类型的指针作为参数。例如:1
2void *memcpy(void *dest, const void *src, size_t len);
void *memset(void *buffer, int c, size_t num);
赏
使用支付宝打赏
使用微信打赏
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏