C# && C

本文介绍了C#中的位运算符,如&、|、^及其与逻辑运算的关系,并展示了如何处理浮点数除法可能遇到的问题。同时,文章提供了一个简单的计算器程序示例,讨论了如何检查除数为零的情况,并引入了插入排序算法的实现。
摘要由CSDN通过智能技术生成

一.C#位运算符

 

位运算符作用于位,并逐位执行操作。&,|,^的真值表如下所示:

05872b483d764f8e9a50f3c58cadd394.jpg

 假设  a=60,b=13现在以二进制表示,则a=0011 1100,b=0000 1101。则a&b=0000 1100,   a|b=0011 1101

a^b=0011 0001,   ~a=1100 0011

PS:1.其中~为按位取反运算符,具有翻转效果,即0变成1,1变成0

    2.<<表示二进制左移运算符。左操作数得值向左移动右操作数指定位数。如a<<2表示1111 0000

同理a>>2表示0000 1111

  &,|,^除了能用于位运算,还能用逻辑运算分别对应与,或,异或。对于bool类型其值与上述真值表一样。

二.C#其他的运算符

  1. sizeof()  返回数据类型大小

  2. typeof() 返回class的类型

  3. &  返回变量的地址

  4. *   变量的指针

  5. ?:    条件表达式 。如果条件为真?则为X:否则为Y

  6. is  判断对象是否为某一类型

  7. as  强制转换,即使转换失败也不会抛出异常。

x?y:z  表示如果表达式x为true,则返回y,否则返回z。(等同于c中if{}else{})

三.C编程遇到的小问题

1.

编程设计一个简单的计算器程序,要求用户从键盘输入如下形式的表达式:操作数1 运算符op 操作数2。然后,计算并输出表达式的值指定的运算符为: 加(+)减(-)乘(*)除(/)代码如下,所给程序是否存在错误,若有,找出错误所在并改正。

代码如下

#include <stdio.h>

int main()

{

         float data1, data2;            

         char op;

         printf("Please enter the expression:");

         scanf("%f %c%f", &data1, &op, &data2); /* %c前有一个空格 */ 

         switch (op) 

         {

                   case '+':

                            printf("%f + %f = %f\n", data1, data2, data1 + data2); 

                            break;

                   case '-':

                            printf("%f - %f = %f\n", data1, data2, data1 - data2);

                            break;

                   case '*':

                            printf("%f * %f = %f\n", data1, data2, data1 * data2); 

                            break;

                   case '/':

                            printf("%f/%f = %f\n", data1, data2,data1/data2); 

                            break;

                   default: 

                            printf("Invalid operator!\n");

         }

        return 0;

}

 已知除法中除数不能为0,所以应修改case '/'。第一次尝试将case '/'中代码修改为以下

if(data2==0)
      printf("Division by zero!\n");
else
      printf(%f/%f=%f\n",data1,data2,data1/data2);

虽然代码能够运行但是已知float类型=0其实代表的是无限趋近于0的浮点数.所以为了更准确表示可采用以下方法。

​
#include <stdio.h>
#include <math.h>
#define EPS 1e-6
int main()
{

         float data1, data2;            
         char op;
         printf("Please enter the expression:");
         scanf("%f %c%f", &data1, &op, &data2); /* %c前有一个空格 */ 
         switch (op) 
         {
                   case '+':
                            printf("%f + %f = %f\n", data1, data2, data1 + data2); 
                            break;
                   case '-':
                            printf("%f - %f = %f\n", data1, data2, data1 - data2);                                    break;
                   case '*':
                            printf("%f * %f = %f\n", data1, data2, data1 * data2); 
                            break;
                   case '/':
                            if (fabs(data2)<=EPS)
                                printf("Division by zero!\n"); 
                            else
                                printf("%f/%f = %f\n", data1, data2,data1/data2);
                            break;
                   default: 
                            printf("Invalid operator!\n");
         }

        return 0;

}

​

 switch-case语句中每一个case执行完后如果不加break;则会继续执行下一个case直到遇见break或者执行完所有的case跳出switch-case。否则会造成以下代码的情况。

#include <stdio.h>
int main(){
    int a=1,b=0;
    switch(a){
    	case 1:
    		switch (b)
    		{
    			case 0:
    				printf("**0**");
    				break;          //有break跳出switch-case 
    			case 1:
    				printf("**1**");
    				break;
			}                       //最外层的switch-case中case 1没有break,所以会继续执行case2 
		case 2:
			printf("**2**");         //输出结果为**0****2**     
			break;
	}
    

	return 0;
} 

2.

数组排序中的插入排序。

#include <stdio.h>
#define lenth 100     /*输入一个数组的大小*/ 
int main(){
	int a[lenth],i,j,k,y;
	for(i=0;i<lenth;i++){         /* 如何输入一个数组*/ 
        scanf("%d",&a[i]);
	}
	for (k=1;k<lenth;k++){       /*插入排序:在待排序的元素中,对前n-1个元素排序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序。
	                                所以a[0]一个元素算有序,所以k=1,从第二个元素排序.之后每插入一个元素都必须与前面排好序数组按个比较*/ 
	    y=a[k];
	    j=k-1;
	    while(j>=0 && a[j]>y){
	    	a[j+1]=a[j];
			a[j]=y;
			j--; 
		} 
	    
	}
	for (i=0;i<lenth;i++){
		printf("%d ",a[i]);
	}
	return 0;
} 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值