# 编程技巧，第 1 部分

> 原文：<https://github.com/angrave/SystemProgramming/wiki/Programming-Tricks%2C-Part-1>

## 使用`cat`作为 IDE

谁需要编辑？ IDE？我们可以使用`cat`！您已经看到`cat`用于读取文件的内容，但它也可用于读取标准输入并将其发送回标准输出。

```
$ cat
HELLO
HELLO 
```

要完成从输入流中读取，请按`CTRL-D`关闭输入流

让我们使用`cat`将标准输入发送到文件。我们将使用'＆gt;'将其输出重定向到文件：

```
$ cat > myprog.c
#include <stdio.h>
int main() {printf("Hi!");return 0;} 
```

（注意！不允许删除和撤消...）完成后按`CTRL-D`。

## 使用`perl`正则表达式编辑代码（又名“记住你的 perl 馅饼”）

如果要更改多个文本文件（例如源代码），则使用正则表达式是一个有用的技巧。 `perl`使得编辑文件非常容易。记住'perl pie'并在网上搜索......

一个例子。假设我们要在当前目录的所有.c 文件中将序列“Hi”更改为“Bye”。然后我们可以编写一个简单的替换模式，它将在所有文件中的每一行上执行：

```
$ perl -p -i -e 's/Hi/Bye/' *.c 
```

（如果你弄错了，不要惊慌，原始文件仍然存在;他们只有扩展名.bak）显然你可以用正则表达式做更多的事情而不是改变 Hi 到 Bye。

## 使用你的 shell `!!`

要重新运行最后一个命令，只需键入`!!`并按`return`重新运行以 g 类型`!g`开头的最后一个命令，然后按`return`

## 使用你的 shell `&&`

厌倦了运行`make`或`gcc`然后运行程序，如果编译正常？相反，使用＆amp;＆amp;将这些命令链接在一起

```
$ gcc program.c && ./a.out 
```

## Make 可以做的不仅仅是制作

您也可以尝试在 Makefile 中添加一行以进行编译，然后运行您的程序。

```
run : $(program)
        ./$(program) 
```

然后跑

```
$ make run 
```

将确保您所做的任何更改都已编译，并一次运行您的程序。也适合一次测试多个输入。虽然您可能只想为此编写常规 shell 脚本。

## 你的邻居太高效了吗？ C 预处理器救援！

使用 C 预处理器重新定义常用关键字，例如

```c
#define if while
```

Protip：将此行放入标准包含的内容之一，例如/usr/include/stdio.h

## 当 C 具有预处理器时，谁需要功能

好的，所以这更像是一个问题。使用看起来像函数的宏时要小心......

```c
#define min(a,b) a<b?a:b
```

a 和 b 的最小值的完全合理的定义。然而，预处理器只是一个简单的文本管理器，所以优先级可以咬你：

```c
int value = -min(2,3); // Should be -2?
```

扩大到

```
int value = -2<3 ? 2 :3; // Ooops.. result will be 2 
```

部分修复是用`()`包装每个参数，用（）包装整个表达式：

```c
#define min(a,b) (  (a) < (b) ?(a):(b) )
```

不过这仍然是 _ 而不是 _ 的功能！例如，你能看出为什么`min(i++,10)`可能会增加一次或两次！？