【问题标题】:Order of precedence in if statement C++if语句C ++中的优先顺序
【发布时间】:2014-04-11 09:40:57
【问题描述】:

我正在尝试设计一个可以检查输入错误的构造,因此我在一个测试程序中编写了两个布尔函数,其参数是字符串引用。我希望我的 if 语句能够评估单词的第一个函数更改部分,然后再次评估第二个函数更改单词,最后评估 && 以查看是否打印。但是,我的代码不会运行,并且当我尝试输出代码时,错误表明没有操作数与 cout 的

#include <iostream>
using namespace std;

bool changeString1(string &word){
    word[0]='a';
    return word[1]=='b';
}

bool changeString2(string &word){
    word[2]='c';
    return word[3]=='d';
}

int main(){
    cout << "hello" << endl;

    string word("cbad");
    if(changeString1(word) && changeString2(word)){
        cout << word << endl;
    }
    system("Pause");
    return 0;
}

【问题讨论】:

  • #include &lt;string&gt;
  • 顺便说一句。使用&amp;&amp; 时,仅在左侧为真时才评估右侧。
  • “但是,我的代码不会运行,并且当我尝试输出代码时,错误提示没有操作数与 cout 的
  • 自从发布这个问题后,我觉得我成长了很多:D

标签: c++ if-statement operator-precedence side-effects


【解决方案1】:

您的问题可能是您的代码开头没有#include &lt;string&gt;

&amp;&amp;|| 表达式的求值顺序是严格的“从左到右”,当表达式由左操作数确定时,保证“短路”。

当使用其他运算符时,它是未定义的,例如if (changeString1(word) + changeString2(word)),编译器将被允许在changeString1之前调用changeString2

换句话说,当表达式中有&amp;&amp;(and) 时,如果第一个条件为假,则不计算第二个表达式,如果第一个表达式为真,则计算第二个条件。由于在这种情况下两者都确实为真,因此对两者都进行了评估。

【讨论】:

  • 从左到右的评估与if无关;例如,在if (foo() + bar()) 中,两个调用的评估顺序是未指定的。评估顺序和短路行为是 &amp;&amp; 运算符定义的一部分,它可以作为 if 条件或在任何其他需要表达式的上下文中出现。
  • @KeithThompson:假设我没有搞砸我的编辑,我已经更正了措辞,以更正确的方式解释我的意思。当然,它与 IF 无关,与运算符有关。我是“简单”(太简单了,显然)
  • 与其说“当表达式已知时”,我会说“当表达式的结果由左操作数确定时”。
  • 我应该注意到 不在那里。这是一个计算器作业的练习题,用于获取一个字符串,将其从中缀转换为后缀,然后计算答案。那么 if(infixToPostfix(expr) &&postfixToAns(expr){cout
  • 是的,但我会将其拆分,因为对于错误消息,您可能需要单独执行“中缀已损坏”或“无法计算答案”。
猜你喜欢
  • 1970-01-01
  • 2012-07-11
  • 2017-08-03
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多