C语言经典错误总结(二)

一.运算符优先级问题

该问题对于大多数C语言程序员都是存在的,原因当然就是无法准确找到表达式计算顺序。

看例题:

假如我们有两个整数a ,b,现在我们要求整数c是一个八位整数,使其前4位与a相同,后4位与b相同,那么我们可能会写出以下代码:

cs 复制代码
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int c = a << 4 + b;
	printf("%d\n", c);
	return 0;
}

你认为它对吗?

如果你不去深究其中运算关系,可能就直接认为它是对的,但如果你知道:加法的优先级是比移位操作符优先级高的,就会一眼看到问题所在

该代码实际行为如下:

cs 复制代码
int c = a <<( 4 + b);

会发现顺序有了变化,从而出错!

那么我们如何改呢:

1.我们可以加括号,这也是避免大部分错误的不二之法。

cs 复制代码
int c = ( a << 4 ) + b;

2.我们可以用 | 操作符

cs 复制代码
int c = a<< 4 | b;

虽然我们可以用括号解决不少问题,但如果所需的括号太多,反而会出现不易理解的情况(假如你写过类似的代码就深有体会),所以我们学会运算符优先级还是非常有必要的。

关于运算符顺序,大家肯定都可以去查,这里只讲一个记忆法:

最高者:()[] -> .

单目操作符>双目操作符(算数操作符>移位操作符>关系操作符>逻辑操作符)>三目操作符 >赋值操作符>逗号操作符

至于每个运算符的结合方向读者可自行了解。

思考与感悟:

读者有没有想过这样一个问题,为啥运算符优先级是这样的?例如:为啥逗号运算符级别最低?

为啥赋值运算符比条件运算符低呢?读者可以认真思考

这里,我们帮大家解释一下上面的例子,读者可以去思考其他操作符情况

逗号运算符常用在需要一个表达式中而不是一条语句情况下替换作为语句结束标志的分号,如写一个这样的表达式:

cs 复制代码
Add(a+2,b*5);

赋值运算符为啥会比条件低呢?看下面代码:

cs 复制代码
c = a + b >100 ?  1 : 0;

关于运算符,就写到这里,希望大家在用到时能三思而后行,也希望大家可以不再出错!

二.注意语句结束标志的分号

为啥要强调这个呢?原因便在与分号对于C语言有些程序非常重要,例如:

cs 复制代码
#include <stdio.h>
int main()
{
	int x = 0;
	if (x > 10);
	printf("hehe\n");
    return 0;
}

这个代码结果显然是一定会输出hehe,为啥呢?就是多写了分号,实际中,大家可能多写,也可能少写,这都是非常严重的问题,我们不能只依赖IDE,自己强大才是王道。

cs 复制代码
struct calendar
{
	int year;
	int month;
	int day;
 }

这个结构体看出问题了吗?

显然,还是分号的问题!!!

该小节希望大家对分号能够加深印象,万不可出现多或少的问题

三."悬置"else问题

关于else问题,我们只需要记住其与最近的if对齐(上面程序)!

cs 复制代码
#include <stdio.h>
int main()
{
	int x = 10;
	int y = 1;
	if (x == 0)
		if (y == 0)
			error();
	else
	{
			int z = x + y;
			Func(z);
	}
	return 0;
}

该代码就姮好的解释了else问题,我们在写时一定要注意,当然,你认为IDE会帮你识别所有,只能说......

总之,希望大家能够不断减少自身语法错误吧!

四.这问题我们共同探讨

cs 复制代码
#include <stdio.h>
int main()
{
	int arr1[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	return 0;
}

关于数组元素初始化,大家都是这样写的,那么如果我在最后一个31后面再加一个,编译器是不会报错的,大家知道这是为什么吗?

对于这里我本身也是不太能理解的,因为我没实际写过这样的代码,所以如果你有不错的想法,可以评论或者私信我,欢迎大家一起学习。

最后,大家一起加油!

相关推荐
手握风云-几秒前
回溯剪枝的“减法艺术”:化解超时危机的 “救命稻草”(三)
算法·剪枝
TinyPiXOS开发者联盟2 分钟前
轻量级嵌入式系统的 Lottie 动画实现
linux·c++·动画·嵌入式开发·lottie·tinypixos·tpgui
元亓亓亓3 分钟前
LeetCode热题100--46. 全排列--中等
算法·leetcode·职场和发展
kyle~3 分钟前
C++---关键字constexpr
java·开发语言·c++
进击的圆儿17 分钟前
10个TCP可靠性与拥塞控制题目整理
网络·c++·tcp/ip
快手技术26 分钟前
从“拦路虎”到“修路工”:基于AhaEdit的广告素材修复
前端·算法·架构
qk学算法27 分钟前
力扣滑动窗口题目-76最小覆盖子串&&1234替换子串得到平衡字符串
数据结构·算法·leetcode
小欣加油28 分钟前
leetcode 860 柠檬水找零
c++·算法·leetcode·职场和发展·贪心算法
粉色挖掘机1 小时前
矩阵在密码学的应用——希尔密码详解
线性代数·算法·机器学习·密码学
买辣椒用券2 小时前
在Linux上实现Modbus RTU通信:一个轻量级C++解决方案
linux·c++