请问这两个代码是什么原理,也就是他的思路是什么。(标签-ar|关键词-while)

#include<stdio.h>
#include<string.h>
char all[]="`1234567890-=QWERTYUIOP[]\ASDFGHJKL;'ZXCVBNM,./";
int main()
{
int ch;
int i;
while((ch=getchar())!=EOF)
{
for(i=1;all[i]&&all[i]!=ch;i++); //这一句不理解原理

        if(all[i])                                      //还有这一句
        {
            putchar(all[i-1]);
        }
        else
        putchar(ch);
    
}
return 0;

}
先谢谢各位了。

注释如下,供参考:

#include<stdio.h>
#include<string.h>
char all[] = "`1234567890-=QWERTYUIOP[]\ASDFGHJKL;'ZXCVBNM,./";  // 字符表
int main()
{
    int ch;
    int i;
    while ((ch = getchar()) != EOF) //输入一个字符,直到碰到文件结束符退出循环
    {
        for (i = 1; all[i] && all[i] != ch; i++); //这一句不理解原理
            //查表循环,查找输入的字符 ch 在表中的位置 i。 all[i] && all[i] != ch; 等价于: all[i] != '\0' && all[i] != ch;
        
        if (all[i]){ //还有这一句:if (all[i])  等价于:if(all[i] != '\0'), 判断 i 的位置是否是表尾了,也就是输入的字符 ch 在表里是否找到

            putchar(all[i - 1]);//输出表里的前一位字符。
        }
        else
           putchar(ch); //输入的字符 ch 不在 all[] 表里面,输出字符 ch 本身。
    }
    return 0;
}

for循环那是如果all[i]为空和all[i]!=ch的时候跳出循环