一個不注意細節的錯讓我很頭痛
阿新 • • 發佈:2020-07-17
昨天給學生寫一個快讀程式,居然沒成功,程式碼如下:
#include<iostream> #include<cstdio> using namespace std; int readint() { char ch=0; int zs=0,fh=1; do { ch=getchar(); } while(ch!='-'&&(ch>'9'||ch<'0')); if(ch=='-')fh=-1; else zs=ch-'0'; while(ch=getchar()&&ch>='0'&&ch<='9') { zs=zs*10+ch-'0'; } zs=zs*fh; return zs; } int main() { int a; a=readint(); cout<<a; return 0; }
經多方跟蹤、除錯、複查均未找到錯因。根據以往經驗,這種錯很難發現,但有一個不太靠譜的方法解決:換個時間重寫一個。今天一大早馬上重寫快讀,基本思路不變,竟然真的成功了。然後把兩個程式一比對便找到了原因。ch=getchar()&&ch>='0'&&ch<='9'這裡的優先順序出問題了,“=”賦值語句的優先順序比&&的優先順序低,所以,系統把把這一句解釋為ch=(getchar()&&ch>='0'&&ch<='9'),而我設計的初衷是(ch=getchar())&&ch>='0'&&ch<='9'。