C语言操作符练习

这篇具有很好参考价值的文章主要介绍了C语言操作符练习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

练习开胃菜

曾经有一道面试题,要求不能创建临时变量(第三个变量),实现两个数的交换。

这道题如果没有前半句的修饰,就只是简单的一道基础题。

法一:

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 10;
	printf("交换前:a=%d,b=%d\n", a, b);
	int tmp = a;
	a = b;
	b = tmp;
	printf("交换后:a=%d,b=%d\n", a, b);
	return 0;
}

但是如果加上了前半句的修饰,就需要更换思路了。

法二:

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 10;
	printf("交换前:a=%2d,b=%2d\n", a, b);
	a = a + b;
	b = a - b; //a + b - b = a
	a = a - b; //a + b - a = b
	printf("交换后:a=%2d,b=%2d\n", a, b);
	return 0;
}

第二种方法比第一种方法更考验思维,但是中方法也有弊端,如果a和b两个数无限接近计算机能够储存的最大值,那结果将不再准确。

法三:

#include <stdio.h>
int main()
{
 int a = 10;
 int b = 20;
 a = a ^ b; //a 变成了 a^b
 b = a ^ b; //a ^ b ^ b = a   相同为0,b变成了a
 a = a ^ b; //a ^ b ^ a = b   
 printf("a = %d b = %d\n", a, b);
 return 0;
}

这就是我想讲述的重点:^ 按位异或操作符,二进制位相同为0,相异为1.

技巧1:a ^ 0 = a;

技巧2:a ^ a = 0;

练习1:

编写代码实现:求⼀个整数存储在内存中的⼆进制中1的个数。
#include <stdio.h>
int main()
{
 int num = 10;
 int count= 0;//计数
 while(num)
 {
 if(num%2 == 1)
 count++;
 num = num/2;
 }
 printf("⼆进制中1的个数 = %d\n", count);
 return 0;
}

这种方法不能计算负数,所以引入下面的方法

#include <stdio.h>
int main()
{
 int num = -1;
 int i = 0;
 int count = 0;//计数
 for(i=0; i<32; i++)
 {
 if( num & (1 << i) )
 count++; 
 }
 printf("⼆进制中1的个数 = %d\n",count);
 return 0;
}



//优化版
#include <stdio.h>
int main()
{
 int num = -1;
 int i = 0;
 int count = 0;//计数
 while(num)
 {
 count++;
 num = num&(num-1);
 }
 printf("⼆进制中1的个数 = %d\n",count);
 return 0;
}

优化版的方法是很难想到的,所以我们要多见,多去思考别人的代码,这样有助于我们的提升。

练习2:

⼆进制位置0或者置1 ,编写代码将13⼆进制序列的第5位修改为1,然后再改回0。

13 2 进制序列: 00000000000000000000000000001101
将第 5 位置为 1 后: 00000000000000000000000000011101
将第 5 位再置为 0 00000000000000000000000000001101
#include <stdio.h>
int main()
{
 int a = 13;
 a = a | (1<<4);
 printf("a = %d\n", a);
 a = a & ~(1<<4);
 printf("a = %d\n", a);
 return 0;
}

这里巧妙运用了位操作符,各位可以总结一下。

问题表达式举例

1、a*b + c*d + e*f

// 表达式的求值部分由操作符的优先级决定。
        表达式1在计算的时候,由于 * + 的优先级⾼,只能保证, * 的计算是⽐ + 早,但是优先级并不能决定第三个 * ⽐第⼀个 + 早执⾏,因此表达式的计算顺序不一。

2、 c + --c;

        同上,操作符的优先级只能决定⾃减 -- 的运算在 + 的运算的前⾯,但是我们并没有办法得知, + 操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义的。

3、 

int i = 10 ;
i = i-- - --i * ( i = -3 ) * i++ + ++i;
printf ( "i = %d\n" , i);
这道题再不同编译器中的结果也不同
C语言操作符练习,c语言,算法

4、

int fun()
{
 static int count = 1;
 return ++count;
}
int main()
{
 int answer;
 answer = fun() - fun() * fun();
 printf( "%d\n", answer);//输出多少?
 return 0;
}

 这个代码实际上有问题,虽然在大多数的编译器上求得的结果都是相同的。

但是上述代码 answer = fun() - fun() * fun(); 中我们只能通过操作符的优先级得知:先
算乘法,再算减法。而函数的调用先后顺序我们无法通过操作符的优先级确定。
5、
#include <stdio.h>
int main()
{
 int i = 1;
 int ret = (++i) + (++i) + (++i);
 printf("%d\n", ret);
 printf("%d\n", i);
 return 0;
}

这道题在gcc上的编译结果为 10 、4,在vs2022上的编译结果为 12、4.

        这段代码中的第⼀个 + 在执⾏的时候,第三个++是否执⾏,这个是不确定的,因为依靠操作符的优先级和结合性是⽆法决定第⼀个 + 和第三个前置 ++ 的先后顺序。所以在不同的编译器上的优先级影响了结果。

结合本期与上期内容,我们要知道:

         即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯⼀的计算路径,那这个表达式就是存在潜在⻛险的,建议不要写出特别复杂的表达式。

 文章来源地址https://www.toymoban.com/news/detail-827610.html

到了这里,关于C语言操作符练习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • <C语言> 操作符

    加法(+):用于将两个操作数相加。 减法(-):用于将第一个操作数减去第二个操作数。 乘法(*):用于将两个操作数相乘。 除法(/):用于将第一个操作数除以第二个操作数。 取模(%):用于求两个操作数相除的余数。 乘法、除法和取模具有相同的优先级,高于加法

    2024年02月12日
    浏览(54)
  • 【C语言】操作符

    算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号操作符 下标引用、函数调用和结构成员操作符 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只

    2024年01月16日
    浏览(52)
  • c语言---操作符(详解)

    算术操作符: + 、- 、*、/ 、% 移位操作符: 位操作符: | ^ ` 赋值操作符: = 、+= 、 -= 、 = 、 /= 、%= 、= 、= 、= 、|= 、^= 单⽬操作符: !、++、–、、 、+、-、~ 、sizeof、(类型) 关系操作符: 、= 、 、= 、 == 、 != 逻辑操作符: 、|| 条件操作符: ? : 逗号表达式: , 下标引⽤: [

    2024年02月22日
    浏览(46)
  • C语言:“~”操作符详解

    ~:含义及用法举例 文章目录 前言 一、“~”是什么? 二、原码、反码及补码 1.简介 2.用法举例 ①正整数 ②负整数 ③零 三、“~”操作符 1.简介 2.用法举例 ①正整数 ②负整数 ③零 本文在简单介绍原码反码补码的基础上,介绍“~”操作符的用法。 ~:一种单目操作符,即对

    2024年02月10日
    浏览(53)
  • C语言---操作符详解

    算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号操作符 下标引用、函数调用和结构成员。 移位操作符,移动的是二进制位。 警告:对于移位运算符,不要移动负位数,这个是标准定义的。 3.1.1、原码、反码、补码介绍 整数

    2024年02月07日
    浏览(41)
  • 【C语言】操作符详解

    👦个人主页:Weraphael ✍🏻作者简介:目前正在回炉重造C语言(2023暑假) ✈️专栏:【C语言航路】 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍 算术操作符 位移操作符 位操作符 赋值操作符 单目操作符 关

    2024年02月16日
    浏览(44)
  • C语言——操作符详解

    哈喽,大家好,今天我们来学习C语言中的各中操作符。 目录 1.操作符的分类 2.算数操作符 整数的二进制表示 3.位移操作符 3.1左移操作符 3.2右移操作符 4.位操作符 5.赋值操作符 6.单目操作符 6.1 单目操作符介绍 ~ 的用法: 6.2 sizeof 和 数组 7.关系操作符 8.逻辑操作符 9. 条件操

    2024年02月05日
    浏览(51)
  • C语言初级<操作符>

    C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。 本篇文章是基于C语言,对入门小知识操作符的讲解,展

    2024年02月12日
    浏览(40)
  • 【C语言】操作符----详解

    💓博客主页:江池俊的博客 ⏩收录专栏:C语言初阶之路 👉其他专栏:数据结构探索 💻代码仓库:江池俊的代码仓库 🍁 如果觉得博主的文章还不错的话,请点赞👍收藏🌟 三连支持一下博主💞 目录 操作符分类:  💨 算术操作符  💨 移位操作符  原码、反码、补码

    2024年02月14日
    浏览(40)
  • c语言操作符(下)

    目录 ​编辑 逗号表达式 下标访问[] 函数调⽤()  sizeof 结构成员访问操作符 结构体 结构体声明 直接访问  .成员名 间接访问   结构体指针-成员名 exp1, exp2, exp3, …expN 运算规则 :从左向右依次执⾏。整个表达式的结果是 最后⼀个表达式 的结果。 如图c的值为逗号表达式中

    2024年02月19日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包