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

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

最后,大家一起加油!

相关推荐
李永奉21 小时前
C语言-指针函数与函数指针及回调函数的使用
c语言·开发语言
AC赳赳老秦21 小时前
采集行为合规自检:OpenClaw 自动校验 robots 协议与采集频率,规避违规采集风险
java·开发语言·c++·python·php·deepseek·openclaw
无名猿1 天前
C++ 查找算法:std::find 与容器成员 find 的性能差距
c++·性能优化·stl·标准库
杨丰玮4181 天前
C语言基础知识(一)————各类符号的含义与输入输出库(stdio)
c语言·开发语言
程序猿编码1 天前
工业视觉多任务方案:可编程梯度信息视觉框架,训练评估 + C++ 部署完整实战
开发语言·c++·视觉·推理引擎
水饺编程1 天前
第1章,了解乌班图环境,使用浏览器和邮箱
c语言·汇编·ubuntu
朝朝辞暮i1 天前
C++ 第 21 课:struct —— 把一组相关数据打包在一起
开发语言·c++·算法
青梅橘子皮1 天前
Blue---二分算法(二分查找与二分答案)
算法
长河1 天前
Java的GC(垃圾回收)中,标记无用对象的核心方法是可达性分析算法
java·jvm·算法
月光船幽幽1 天前
加性偏移外推提升参数识别可靠性
python·算法