【问题标题】:Error in ternary operator, thowing error: "expected primary-expression before ';' token "三元运算符中的错误,抛出错误:“预期的主表达式在';'之前令牌“
【发布时间】:2021-05-15 11:25:19
【问题描述】:
#include <iostream>
#include <string.h>

using namespace std;

struct menuItemType {
    string mennuItem;
    double menuPrice;
};

int main() {
    int choice, flag[8]={0}, iNum;
    cout << "Our menu includes:" << endl << "1. Plain Egg $1.45" << endl << "2.Bacon and Egg $2.45" << endl << "3. Muffin $0.99" << endl << "4. French Toast $1.99" << endl <<"5. Fruit Basket $2.49" << endl << "6. Cereal $0.69" << endl <<"7. Coffee $0.50" << endl <<"8. Tea $0.75" << endl;
    menuItemType menuList[8]={{"Plain Egg",1.45},{"Bacon and Egg",2.45},{"Muffin",0.99},{"French Toast",1.99},{"Fruit Basket",2.49}, {"Cereal",1.99},{"Coffee",0.50},{"Tea",0.45}};
    cout << "how many items you wish to order?";
    cin >> choice;
    for (int i=0;i<choice;i++) {
        cout << "enter item number" << i;
        cin >> iNum;
        iNum==1?flag[0]++:iNum==2?flag[1]++:iNum==3?flag[2]++:iNum==4?flag[3]++:iNum==5?flag[4]++:iNum==6?flag[5]++:iNum==7?flag[6]++:iNum==8?flag[7]++:; 
    }
    
    
    return 0;
}

我不明白为什么它会在 iNum==1?flag[0]++:iNum==2?flag[1]++:iNum==3?flag[2]++:iNum==4?flag[3]++:iNum==5?flag[4]++:iNum==6?flag[5]++:iNum==7?flag[6]++:iNum==8?flag[7]++:; 上抛出错误。
错误是 expected primary-expression before ';'令牌,如果我删除最后一个分号,它会引发另一个错误expected ':' before ';'令牌

【问题讨论】:

  • 请不要写iNum==1?flag[0]++:iNum==2?flag[1]++:iNum==3?flag[2]++:iNum==4?flag[3]++:iNum==5?flag[4]++:iNum==6?flag[5]++:iNum==7?flag[6]++:iNum==8?flag[7]++:;之类的代码。相反,使用 if 语句。您将获得相同的性能,并且代码将更具可读性。
  • 这种代码很难调试,就像您刚刚遇到的那样。使用更实用的 if-else 语句。
  • @NathanOliver 好的,但你能解释一下错误吗?我使用这个运算符来缩短代码而不是为了性能:)
  • 为什么要缩短代码?它的长度对台式计算机没有实际意义。从不得不问这个问题中可以看出,缩短的代码通常很难理解。我无法解释错误的原因是我不会试图解析条件运算符的嵌套。
  • @ShayanHasanKhan if (iNum &gt;= 1 &amp;&amp; iNum &lt;= 8) ++flag[iNum-1]; -- 你觉得什么更清楚?你的原始代码,还是这个?

标签: c++ nested conditional-operator


【解决方案1】:

... ? flag[7]++ : ;结尾 如果最后一个条件(? 之前)为 false,则需要提供一个表达式(: 之后)。

这是因为a = b ? c : d; 需要为a 提供一个值:它可以是cd,具体取决于b

在你的情况下,如果条件为假,你会提供什么价值?

【讨论】:

    【解决方案2】:

    您的条件不完整:

    iNum==1?flag[0]++:iNum==2?flag[1]++:iNum==3?flag[2]++:iNum==4?flag[3]++:iNum==5?
        flag[4]++:iNum==6?flag[5]++:iNum==7?flag[6]++:iNum==8?flag[7]++:;
                                                                       ^
                                                                       |-here      
    

    所以如果iNum 不是 8,你应该添加什么值

    iNum==8?flag[7]++:0;
    

    【讨论】:

    • 哦,好的,好的,新手错误,抱歉,谢谢:))
    【解决方案3】:

    正如您所写,您使用的是ternary operator。 “Ternary”表示“由三个事物组成”,在这种情况下事物是操作数。根据定义,三元运算符具有三个操作数。

    (注意:“三元”描述与“二元”相同级别的运算符。C++ 有几个二元运算符——例如加法——但只有一个三元运算符,即conditional operator。有时这会导致人们交替使用“三元”和“条件”。这反过来又导致一些人使用“三元”一词而没有意识到它的含义。)

    让我们看看产生错误的三元运算符的使用。 通过simplifying your code,更容易专注于具体问题。

    iNum==8?flag[7]++:;
    

    第一个操作数是iNum==8,第二个是flag[7]++,第三个是……嗯……嗯?我期待找到分号之前的第三个操作数(又名“;”标记)。每个操作数必须是某种表达式,而这又要求至少存在primary expression,但在冒号之后和“;”之前没有主表达式令牌。有人可能会说在 ';' 之前需要一个主表达式。令牌。事实上,我认为你的编译器确实这么说...... ;)

    【讨论】:

      猜你喜欢
      • 2013-12-23
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 2012-04-19
      • 1970-01-01
      相关资源
      最近更新 更多