对于由范围R = [ x,y ] 限制的任何整数输入W,由于缺少更好的项,"溢出"是W对R的.如果W超过y,这会导致它回绕.W % (y-x+1) + x
作为这个原则的一个例子,假设我们迭代一个日历的月份:
int this_month = 5;
int next_month = (this_month + 1) % 12;
其中两个整数都在0到11之间(包括0和11).因此,上面的表达式将整数"钳制"到范围R = [0,11].这种使用表达式的方法简单,优雅且有利,因为它省略了分支.
现在,如果我们想要做同样的事情,但倒退呢?以下表达式有效:
int last_month = ((this_month - 1) % 12 + 12) % 12;
但这是深奥的.它怎么能被美化?
tl; dr - 可以((x-1) % k + k) % k进一步简化表达吗?
注意:指定C++标记,因为其他语言以不同方式处理模运算符的负操作数.
我string::at在学校接受教育,但是通过探索我看到的字符串库string::operator[],我之前从未展示过.
我现在正在使用operator[]并且从未使用at过,但有什么区别?以下是一些示例代码:
std::string foo = "my redundant string has some text";
std::cout << foo[5];
std::cout << foo.at(5);
它们在输出方面基本相同,但是有一些我不知道的细微差别吗?
一开始这可能看起来是一个愚蠢/琐碎的问题,但是当我这样做时:
char f_gear = 15;
我得到了正常的输出
"?"
但是当我宣布它时,我用零填充它:
char f_gear = 015;
我得到奇怪的输出使文本看起来乱码(在一行)并且空白前一行.当我试图看到个人角色时,我得到以下内容:
"  ??@?S? "
有什么本质的不同?不是15 == 015?
当我发布问题时,== EDIT == Stack Overflow改变了文本.我真正看到的输出是一些空白字符.
解释这个问题有点棘手,但假设必须显示两个交替的字符:
for(int n=0; n<20; n++)
{
    cout<<(n%2==0 ? 'X' : 'Y');
}
是否有一种单行或更有效的方法来完成上述任务?(即使用类似<iomanip>的setfill())?
在C++中,我们可以定义和重载运算符以使代码更美观.但是,当需要从定义它的类中调用运算符时,语法不那么优雅.
例如,考虑典型的使用operator[]上string:
std::string word("Hello!");
char first = word[0];
简单.但是,如果这样的运算符需要从一些本身定义它的类中调用呢?语法不是很漂亮:
(*this)[i];//option 1
operator[](i);//option 2
this->operator[](i);//option 3
在性能和/或行为方面,三者之间有什么区别,特别是在处理继承或多态时?哪个是正确的,明确的语法?
假设我有一些代码调用一个像vector :: length()这样的方法几次......创建一个临时变量就像
int length=myVector.length()
使它比调用方法几次更有效?
这是一个有点假设的问题,所以让我们假设调用vector :: length()是获得我们想要的结果的唯一方法.
这适用于任何语言,但现在,让我们看看c ++.假设我们有两个字符必须采用十六进制值:
char b, t;
do {
    //some code
} while(((b<'0' || b>'9') && (b<'A' || b>'F')) || ((t<'0' || t>'9') && (t<'A' || t>'F')));
Phew最后一个条件看起来很可怕.让我们来看看另一个:
char b, t;
do {
    //some code
} while(string(1,b).find_first_of("0123456789ABCDEF")==-1 || string(1,t).find_first_of("0123456789ABCDEF")==-1);
代码看起来仍然非常混乱,但至少我们可以理解发生了什么:初始化几个字符串以查看其中是否有十六进制字符.
假设性能没有差异,第二个解决方案是否优于第一个解决方案,还是有另一种方法来查看char是否包含十六进制值而不会使代码膨胀?
如果需要,可以在循环中将字符的大小写更改为ALLCAPS或小写(目前为ALLCAPS).
我喜欢代码高尔夫.根据CVE-2016-5195,我想知道我的"高尔夫"代码是否能引发竞争条件.
假设我们有两个函数,它们都返回一个布尔值,我们正在初始化一个名为的布尔变量result:
result = foo() || bar();
在理想的世界中,我们有两种情况:
foo回报true.难道不叫bar.result等于true.[短路情况]foo回报false.不要打电话bar().result等于什么bar回报.我的问题:是否曾经有过违反短路评估的时间,并且bar尽管foo返回被调用true,或者更糟糕的bar是,在被调用之前foo被调用,可能是因为多线程?如果是这样,你能提供一段会触发这种行为的代码吗?
你的答案可能是关于这种语法有效的任何语言,尽管我认为某些语言比其他语言更严格.