我的疑惑

疑问#include<stdio.h>
void main()
{   int x=4;
    do
 {printf("%d",x-=2);
 }
 while(!(--x));

}

这是我看过的一个程序,但我不明白是啥意思,是先执行do里面的内容吗?也就是x=x-2得2,那while(!(--x))是啥意思!俺是真看不懂啊。。。

向各位大神求救了     俺是大一新生别见怪  谢了!

 

<think>我们之前已经解释了程序如何区分左符号和右符号:程序通过预先定义的符号对(SymbolPair数组)来识别。具体来说: 1. 程序从Symbol.txt文件中读取符号对,每一行定义一对符号,第一个字符为左符号,第二个字符为右符号(忽略空格和制表符等)。 2. 在处理每个字符时,程序会检查这个字符是否等于任何一个已定义的左符号(通过遍历符号对数组的left成员),如果是,则将其视为左符号并入栈。 3. 如果不是左符号,再检查它是否等于任何一个已定义的右符号(遍历符号对数组的right成员),如果是,则将其视为右符号并进行匹配检查。 因此,计算机判断某个字符是左符号还是右符号,完全依赖于符号对数组的定义。例如,在默认符号对中: symbols[0] = { '(', ')' } -> 程序知道 '(' 是左符号,')' 是右符号 symbols[1] = { '[', ']' } -> 程序知道 '[' 是左符号,']' 是右符号 symbols[2] = { '{', '}' } -> 程序知道 '{' 是左符号,'}' 是右符号 所以,当程序遇到字符'('时,它在符号对数组中查找,发现'('是某个符号对的left成员,因此将其作为左符号处理(入栈)。当遇到字符'}'时,它在符号对数组中查找,发现'}'是某个符号对的right成员,因此将其作为右符号处理(检查栈顶是否匹配)。 注意:一个字符不能同时被定义为左符号和右符号(尽管程序没有明确禁止,但按照当前逻辑,先检查左符号,所以如果同一个字符同时出现在某个符号对的left和另一个符号对的right,那么它会被优先识别为左符号)。但在实际使用中,通常不会这样定义。 总结:计算机通过预先加载的符号对定义来区分左右符号,每个字符在符号对数组中的角色是明确的。</think>### 计算机如何判断字符是左符号还是右符号 计算机本身并不知道字符的含义,程序通过以下机制实现符号角色判断: #### 核心判断机制 1. **符号定义文件(Symbol.txt)** 程序从外部文件加载符号定义,每行定义一对符号: ``` ( ) [ ] { } ``` 文件中的**第一个字符**被识别为左符号,**第二个字符**被识别为右符号 2. **双重扫描算法** 处理每个字符时执行两次独立扫描: ```c // 第一轮扫描:检查是否为左符号 for (U4 j = 0; j < symbolCount; j++) { if (c == symbols[j].left) { // 与定义文件中的左符号比较 // 识别为左符号,执行入栈操作 stack[++top] = c; break; } } // 第二轮扫描:检查是否为右符号 for (U4 j = 0; j < symbolCount; j++) { if (c == symbols[j].right) { // 与定义文件中的右符号比较 // 识别为右符号,执行匹配检查 if (stack[top] == symbols[j].left) { top--; // 匹配成功则出栈 } break; } } ``` #### 判断过程示例 以字符 `(` 和 `}` 为例: 1. **处理 `(` 字符**: - 第一轮扫描:与所有 `symbols[j].left` 比较 - 匹配到 `symbols[0].left = '('` → 识别为左符号 - 第二轮扫描:跳过(因第一轮已匹配) 2. **处理 `}` 字符**: - 第一轮扫描:与所有左符号比较 → 无匹配 - 第二轮扫描:与所有 `symbols[j].right` 比较 - 匹配到 `symbols[2].right = '}'` → 识别为右符号 #### 关键特征 1. **角色完全由定义决定** 同一个字符在不同定义中可有不同角色: - 若定义 `< >`,则 `<` 是左符号 - 若定义 `> <`,则 `>` 变成左符号 2. **处理优先级** 左符号检测优先于右符号检测: - 若字符同时匹配左/右符号定义(如定义 `* *`) - 程序会优先识别为左符号(因左符号检测在前) 3. **未定义字符处理** 若字符不匹配任何定义: - 两轮扫描都不匹配 → 被完全忽略 - 不影响括号匹配过程
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值