《C语言缺陷和陷阱》-笔记

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

前言

在这一节中,我们将探索对记号的意义的普遍的误解以及记号和组成它们的字符之间的关系。稍后我们将谈到预处理器。

一、==和=

从Algol派生出来的语言,如Pascal和Ada,用:=表示赋值而用=表示比较。而C语言则是用=表示赋值而用==表示比较。这是因为赋值的频率要高于比较,因此为其分配更短的符号。

这种便捷导致了一个潜在的问题:可能将需要比较的地方写成赋值。

1.=

在C语言中 = 是赋值运算符,可以对自变量进行赋值。

int a = 0

2.==

==单个符号,= =是两个符号

在C语言中 == 才表示判断是否相等。

常在循环语句和条件判断语句中使用,作为一个判断条件。

int a,b;

if(a==b)

{

int c = a + b;

printf("%d\n", c );

}

二、&和 | &&和||

&既是逻辑运算符也是位运算符,作为取地址符时还是单目运算符;

按位 &

有0为0,同1为1

0111 1101 & 1111 0000 =0111 0000 ;

按位 |

有1为1,同0为0

0111 1101 |1111 0000 = 1111 1101;

逻辑运算符 &&

都为真,则结果为真;否则结果为假。

||

如果两个操作数中至少有一个为真,则结果为真;如果两个操作数都为假,则结果为假。

二、复合操作符

C语言参考手册说明了如何决定:"如果输入流到一个给定的字符串为止已经被识别为记号,则应该包含下一个字符以组成能够构成记号的最长的字符串"

在C语言中既有 / ,* ,= 这样的单目操作符,又有想 ==,!=,这样的复合操作符。当C编译器遇到紧连在一起的/和*时,要特别注意它们和其他操作符的间隔。

例如:/**/是用

如果/是一个记号的第一个字符,并且/后面紧随了一个*,则这两个字符构成了注释的开始,不管其他上下文环境。

i = j /*p

当*/之间没有隔开,就会从将p注释;

所以,可以这样改动

i = j / *p 或 i = j /(*p)

模棱两可的写法容易造成麻烦,因此我们在写代码中尽量避免。

三、字符串和字符

单引号(' ')和双引号(" ")在C中的意义完全不同

1.单引号

单引号(' ')里是一个字符

char arr[] = {'H','e','l','l','o',' ','w','o','r','l','d'};

可以用此字符串表示一个大数来节约空间,但是不推荐这么做,这样会报错。

2.双引号(" ")

双引号(" ")里默认结尾有/0表示访问结束。

双引号(" ")在打印时,常使用

printf(" ")

使用一个指针来代替一个整数通常会得到一个警告消息(反之亦然),使用双引号来代替单引号也会得到一个警告消息(反之亦然)

杨氏矩阵

#include<stdio.h>

int find_num(int arr[3][3], int* px, int* py, int k)

{

int x = 0;

int y = *py - 1;

while (x < *px && y >= 0)

{

//向下查找

if (k > arr[x][y])

{

x++;

}

//向左查找

else if (k < arr[x][y])

{

y--;

}

//找到了

else

{

*px = x;

*py = y;

return 1;

}

}

return 0;

}

int main()

{

int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };

int k = 0;

scanf("%d", &k);

int x = 3;

int y = 3;

int ret = find_num(arr, &x, &y, k);

if (ret == 1)

{

printf("找到了,下标是%d %d\n", x, y);

}

else

{

printf("找不到\n");

}

return 0;

}


相关推荐
CODE_RabbitV3 分钟前
【保姆级实操版 - STM32 系列笔记】新手入门STM32第一课:CubeMX+Keil MDK实现LED点灯
笔记·stm32·嵌入式硬件
是翔仔呐4 分钟前
第6章 UART串口通信!掌握单片机与外界的双向数据通道,实现跨设备交互
c语言·开发语言·单片机·嵌入式硬件·gitee
带娃的IT创业者5 分钟前
从本地开发到 PyPI发布:WeClaw 的 Python 包标准化之旅
开发语言·python
2201_758642647 分钟前
自定义内存检测工具
开发语言·c++·算法
吠品10 分钟前
QEMU Windows虚拟机NAT网络配置指南:实现IP自动获取与外部访问
开发语言·php
fpcc10 分钟前
C++编程实践—操作系统调优和内核旁支
开发语言·c++
不想看见40416 分钟前
QAbstractItemModel 自定义实现--Qt 模型 / 视图(MVC)
开发语言·qt·mvc
不想看见40417 分钟前
Qt 事件循环与事件过滤器讲解【详细】
开发语言·数据库·qt
FL162386312918 分钟前
基于yolov8+pyqt5实现的水尺图像识别与水深计算系统
开发语言·qt·yolo
sycmancia19 分钟前
QT——GUI程序原理分析、Hello QT、调试的基本方法
开发语言·qt