1. 程式人生 > 實用技巧 >一個不注意細節的錯讓我很頭痛

一個不注意細節的錯讓我很頭痛

  昨天給學生寫一個快讀程式,居然沒成功,程式碼如下:

#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'。