【发布时间】:2018-09-08 18:23:46
【问题描述】:
我已经搜索了很多关于此的参考,但我没有任何成功,所以我想我会在这里问。基本上,我试图理解一个用于在 linux 中创建 shell 的 C 编写程序,但我遇到了这段代码的问题
...
else if (args[0][0]-'!'==0){
int x = args[0][1]-'0';
int z = args[0][2]-'0';
...
}
args 存储用户输入的命令。例如,稍后子进程的地址空间(父进程读取命令,子进程执行它们)使用对execvp(args[0], args) 的调用来替换。 args的定义如下:char *args[MAX_LINE/2 +1];
我一直难以理解的是访问数组的方式;具体来说,这些表达在这种情况下的含义是什么: args[0][0]-'!'==0 args[0][1]-'0'; args[0][2]-'0';
【问题讨论】:
-
它是一个数组数组,所以一个索引告诉你要抓取哪个数组,另一个索引告诉你要抓取该数组的哪个元素。
-
首先,请记住
char只是一个小的int。而像'!'这样的字符常量实际上是int值。当char用于算术运算时,它会提升为int。现在考虑所有这些,当args中第一个字符串的第一个字符等于'!'时,你认为减去'!'会发生什么?结果会是什么? -
或更短,这只是
if (args[0][0] == '!')的一种混淆方式 -
代码正在检查第一个(假定的)字符串的前三个字符。但是
if (args[0][0]-'!'==0)是一种奇怪的写法if (args[0][0] == '!') -
至于
x和z的初始化,我的第一条评论应该对您有所帮助。查看ASCII table 也可能有用。这是获取字符数字的整数值的一种不太混淆且非常常见的方法。