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后面再加一个,编译器是不会报错的,大家知道这是为什么吗?

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

最后,大家一起加油!

相关推荐
forth touch9 分钟前
c++ shared_ptr 常见构造函数
开发语言·c++
DdddJMs__13518 分钟前
C语言 | Leetcode C语言题解之第552题学生出勤记录II
c语言·leetcode·题解
DdddJMs__13521 分钟前
C语言 | Leetcode C语言题解之第554题砖墙
c语言·leetcode·题解
Frank学习路上34 分钟前
【C++】OGRE:面向对象图形渲染库配置与示例
c++·图形渲染·ogre
weixin_478689761 小时前
【121. 买卖股票的最佳时机】——贪心算法/动态规划
算法·贪心算法·动态规划
武昌库里写JAVA1 小时前
mysql 几种启动和关闭mysql方法介绍
java·开发语言·算法·spring·log4j
我是聪明的懒大王懒洋洋1 小时前
力扣力扣力:53.最大子数组和
算法·leetcode·职场和发展
doll ~CJ1 小时前
定时器(QTimer)与随机数生成器(QRandomGenerator)的应用实践——Qt(C++)
c++·qt·计时器与随机数生成器运用·图片循环播放
九圣残炎2 小时前
【从零开始的LeetCode-算法】3345. 最小可整除数位乘积 I
java·算法·leetcode
shinelord明2 小时前
【再谈设计模式】抽象工厂模式~对象创建的统筹者
数据结构·算法·设计模式·软件工程·抽象工厂模式