【问题标题】:Modulo in a conditional expression条件表达式中的取模
【发布时间】:2015-12-04 21:48:23
【问题描述】:

我对编程非常陌生,我从 Bjourne 的书开始:编程原理和实践 C++ 第 2 版。习题 8 第 3 章他要求:

“编写一个程序来测试一个整数值以确定它是奇数还是偶数......提示:请参阅第 3.4 节中的余数(模)运算符。”

我可以这样做:

int main() {
int n;
cout << "Enter an integer: ";
cin >> n;
if ( n%2 == 0) {
    cout << n << " is even.";
}
else {
    cout << n << " is odd.";

}
return 0;
}

但他在自己的网站上给出了自己的解决方案:

int main()
{
int val = 0;
cout << "Please enter an integer: ";
cin >> val;;
if (!cin) error("something went bad with the read");
string res = "even";
if (val%2) res = "odd"; 

cout << "The value " << val << " is an " << res << " number\n";

keep_window_open(); 
}
catch (runtime_error e) {   
cout << e.what() << '\n';
keep_window_open("~");  
}

/*
Note the technique of picking a default value for the result ("even") and changing it only 
if needed.
The alternative would be to use a conditional expression and write
    string res = (val%2) ? "even" : "odd";

什么是

string res = "even";
if (val%2) res = "odd";

string res = (val%2) ? "even" : "odd";

真的在做什么?我以前没见过他在书中解释过这些。此外,最后一个代码,当我输入偶数时它给我“奇数”结果,当我输入奇数时它给我一个“偶数”结果。到底是怎么回事?抱歉发了这么长的帖子,希望我能解释一下我需要什么...

【问题讨论】:

  • 我可以理解你之前没有见过三元运算符,但你想知道if 是做什么的吗?
  • 也许我无法理解 (val%2) 是如何在 If 语句中作为条件工作的......
  • 好吧,你现在可以了。你有答案。
  • if(x) 表示if( (x) != 0 ),其中x 是任意表达式
  • 太棒了,谢谢伙计!

标签: c++ modulo modulus


【解决方案1】:

那个? : 是ternary operator

if (val%2) res = "odd";

只是一个相当简洁的版本

if (val%2) {
  res = "odd";
}

请注意,if(...) 实际上关心值是“真”还是“假”。它只检查零或非零。所以相当于

if( val%2 != 0)

第二个命令行:string res = (val%2) ? "even" : "odd";类似是一种简写方式:

string res;
if(val%2 != 0){
    res = "even";
}
else{
    res = "odd";
}

这类命令的语法是condition ? value_if_true : value_if_false

【讨论】:

  • condition ? value_if_true : value_if_false 但如果在这种情况下 true!=0 或者只是 1 的值,应该res 的值不是 "odd" _instead _"even"??
【解决方案2】:

除了前面的答案,您必须注意布尔值(或“真”值)是 0 和 1,(在布尔代数中,0 为假,1 为真)

那么,当

string res = (val % 2) ? "even" : "odd";

请注意,当您给出奇数时,它总是返回数字 1,即“真”,反之亦然。

您必须扭转这些局面才能使程序正常工作。

【讨论】:

  • 转身是指:string res = (val % 2) ? "odd" : "even";?
  • 是的,我的意思是,很明显,如果你把它转过来,看到你的问题,它就会起作用。但请记住,val % 2,即 val = 任何奇数,将导致“1”等于“true”,因此将执行 true 语句。
  • 感谢上帝!从昨天开始,我一直在尝试获得这段代码的答案,甚至在 cmets 中询问过,但无济于事。我的意思是,我发现只需交换这两个值就可以使程序正常工作,但是由于这本书就是这样,而且我是菜鸟,所以我对“修复”它持怀疑态度……太糟糕了,我不能+代表你现在。再次TY。
  • 别担心!我只是在帮忙。 :) 人们有时似乎忘记分析幕后真正发生的事情。祝你好运,编程愉快!
【解决方案3】:

他只是不写多个括号,根本不使用它们

string res = "even"; //default value 
if (val%2) res = "odd"; //in case it is odd, value changes 

//output or threat in some way value. 

改为

string res = (val%2) ? "even" : "odd";

简单地写下你之前写的if/else

【讨论】:

  • string res = (val%2) ? "even" : "odd"; 但这给了我奇数的“偶数”和偶数的“奇数”...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多