C语言50为什么是0

Python021

C语言50为什么是0,第1张

C语言50是0是因为两个数判断有一个是假就是0,表示false。

对于判断0或者非0两种状态,汇编有直接对应的指令(jnz跟jz指令),如果要判断是否等于3,则需要额外的一条指令将目标减3然后再同0进行比较,这样指令数量增加了,也就耗费了额外的时钟周期。所以,C作为一种相对贴近汇编的底层编程语言,if命令只需要判断0跟非零就够了,它翻译成汇编最简洁。早年间的始祖级程序员曾经教导弟子:条件判断尽量只跟0进行比较,效率最高。其原理正是因为早年间汇编的特性导致。现在或者将来,或许会有其它的汇编架构,允许单指令直接与非零变量进行比较并跳转,但在C语言设计的当初,汇编必定是与0比较效率最高的。在那个程序员大都懂一点汇编的年代,做出C语言只与零比较这个决定,简直是天经地义的。

当然,C语言中的0并非一直用来表示负面概念。对于if语句的判断来说,0为假,非零为真。但对于C语言函数的返回值来说,通常是返回0代表成功,返回非零代表错误代码。所以,C语言确实是只需要0跟非零两种状态判断,但并非永远用0代表负面的那个方向。

int main()

{

int i

double a[50],fac=1

for(i=1i<=50i++)

{

fac=fac*i

a[i-1]=fac

printf("%d\n",i)

printf("%fd\n",a[i-1])

}

return 0

}

#include <stdio.h>

#include <stdlib.h>

#define NUM 10

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

//冒泡排序算法

//基本思想:比较相邻的两个数,如果前者比后者大,则进行交换。每一轮排序结束,选出一个未排序中最大的数放到数组后面。

void bubbleSort(int *arr, int n) {

int i,j

for (i = 0i<n - 1i++)

for (j = 0j <n - i - 1j++) {

//如果前面的数比后面大,进行交换

if (arr[j] >arr[j + 1]) {

int temp = arr[j]

arr[j] = arr[j + 1]

arr[j + 1] = temp

}

}

}

//最差时间复杂度为O(n^2),平均时间复杂度为O(n^2)。稳定性:稳定。辅助空间O(1)。

//升级版冒泡排序法:通过从低到高选出最大的数放到后面,再从高到低选出最小的数放到前面,

//如此反复,直到左边界和右边界重合。当数组中有已排序好的数时,这种排序比传统冒泡排序性能稍好。

//升级版冒泡排序算法

void bubbleSort_1(int *arr, int n) {

//设置数组左右边界

int left = 0, right = n - 1

//当左右边界未重合时,进行排序

while (left<=right) {

int i,j

//从左到右遍历选出最大的数放到数组右边

for (i =lefti <righti++) {

if (arr[i] >arr[i + 1]) {

int temp = arr[i]

arr[i] = arr[i + 1]

arr[i + 1] = temp

}

}

right--

//从右到左遍历选出最小的数放到数组左边

for (j = rightj>leftj--) {

if (arr[j + 1] <arr[j]) {

int temp = arr[j]

arr[j] = arr[j + 1]

arr[j + 1] = temp

}

}

left++

}

}

int main(int argc, char *argv[]) {

int arr[NUM],i,j,temp

printf("请输入10个数:\n")

for(i=0i<NUMi++) {

printf("请输入第(%d)个数:",i+1)

scanf("%d",&arr[i])

}

printf("\n输入如下排列:\n")

for(i=0i<NUMi++) {

printf("%4d",arr[i])

}/*

for(i=0i<NUMi++) {

for(j=i+1j<NUMj++) {

if(arr[i]>arr[j]) {

temp=arr[i]

arr[i]=arr[j]

arr[j]=temp

}

}

}*/

bubbleSort_1(arr,NUM)

/*printf("\n从小到大如下排列:\n")

for(i=0i<NUMi++) {

printf("%4d",arr[i])

}*/

printf("\n从大到小如下排列:\n")

for(i=NUM-1i>=0i--) {

printf("%4d",arr[i])

}

return 0

}