小编aya*_*ane的帖子

是否有使用modulo进行向后环绕的表达式("反向溢出")?

对于由范围R = [ x,y ] 限制的任何整数输入W,由于缺少更好的项,"溢出"是WR的.如果W超过y,这会导致它回绕.W % (y-x+1) + x

作为这个原则的一个例子,假设我们迭代一个日历的月份:

int this_month = 5;
int next_month = (this_month + 1) % 12;
Run Code Online (Sandbox Code Playgroud)

其中两个整数都在0到11之间(包括0和11).因此,上面的表达式将整数"钳制"到范围R = [0,11].这种使用表达式的方法简单,优雅且有利,因为它省略了分支.

现在,如果我们想要做同样的事情,但倒退呢?以下表达式有效:

int last_month = ((this_month - 1) % 12 + 12) % 12;
Run Code Online (Sandbox Code Playgroud)

但这是深奥的.它怎么能被美化?


tl; dr - 可以((x-1) % k + k) % k进一步简化表达吗?

注意:指定C++标记,因为其他语言以不同方式处理模运算符的负操作数.

c++ algebra modulo

19
推荐指数
3
解决办法
1万
查看次数

13
推荐指数
2
解决办法
6193
查看次数

string :: at和string :: operator []有什么区别?

string::at在学校接受教育,但是通过探索我看到的字符串库string::operator[],我之前从未展示过.

我现在正在使用operator[]并且从未使用at过,但有什么区别?以下是一些示例代码:

std::string foo = "my redundant string has some text";
std::cout << foo[5];
std::cout << foo.at(5);
Run Code Online (Sandbox Code Playgroud)

它们在输出方面基本相同,但是有一些我不知道的细微差别吗?

c++ string

10
推荐指数
3
解决办法
4156
查看次数

15和015有什么区别?

一开始这可能看起来是一个愚蠢/琐碎的问题,但是当我这样做时:

char f_gear = 15;
Run Code Online (Sandbox Code Playgroud)

我得到了正常的输出

"?"
Run Code Online (Sandbox Code Playgroud)

但是当我宣布它时,我用零填充它:

char f_gear = 015;
Run Code Online (Sandbox Code Playgroud)

我得到奇怪的输出使文本看起来乱码(在一行)并且空白前一行.当我试图看到个人角色时,我得到以下内容:

"  ??@?S? "
Run Code Online (Sandbox Code Playgroud)

有什么本质的不同?不是15 == 015?

当我发布问题时,== EDIT == Stack Overflow改变了文本.我真正看到的输出是一些空白字符.

c++ char output

6
推荐指数
2
解决办法
708
查看次数

如何有效地输出两个交替的字符或没有循环?

解释这个问题有点棘手,但假设必须显示两个交替的字符:

for(int n=0; n<20; n++)
{
    cout<<(n%2==0 ? 'X' : 'Y');
}
Run Code Online (Sandbox Code Playgroud)

是否有一种单行或更有效的方法来完成上述任务?(即使用类似<iomanip>setfill())?

c++ optimization char output

5
推荐指数
2
解决办法
760
查看次数

在`this`上调用运算符的这些不同方法有什么区别?

在C++中,我们可以定义和重载运算符以使代码更美观.但是,当需要从定义它的类中调用运算符时,语法不那么优雅.

例如,考虑典型的使用operator[]string:

std::string word("Hello!");
char first = word[0];
Run Code Online (Sandbox Code Playgroud)

简单.但是,如果这样的运算符需要从一些本身定义它的类中调用呢?语法不是很漂亮:

(*this)[i];//option 1
operator[](i);//option 2
this->operator[](i);//option 3
Run Code Online (Sandbox Code Playgroud)

在性能和/或行为方面,三者之间有什么区别,特别是在处理继承或多态时?哪个是正确的,明确的语法?

c++ syntax operator-overloading this

2
推荐指数
1
解决办法
76
查看次数

是多次调用访问器方法还是声明临时变量更有效?

假设我有一些代码调用一个像vector :: length()这样的方法几次......创建一个临时变量就像

int length=myVector.length()
Run Code Online (Sandbox Code Playgroud)

使它比调用方法几次更有效?

这是一个有点假设的问题,所以让我们假设调用vector :: length()是获得我们想要的结果的唯一方法.

c++ variables accessor

0
推荐指数
1
解决办法
434
查看次数

初始化临时字符串以保持条件可读是否可以接受?

这适用于任何语言,但现在,让我们看看c ++.假设我们有两个字符必须采用十六进制值:

char b, t;

do {
    //some code

} while(((b<'0' || b>'9') && (b<'A' || b>'F')) || ((t<'0' || t>'9') && (t<'A' || t>'F')));
Run Code Online (Sandbox Code Playgroud)

Phew最后一个条件看起来很可怕.让我们来看看另一个:

char b, t;

do {
    //some code

} while(string(1,b).find_first_of("0123456789ABCDEF")==-1 || string(1,t).find_first_of("0123456789ABCDEF")==-1);
Run Code Online (Sandbox Code Playgroud)

代码看起来仍然非常混乱,但至少我们可以理解发生了什么:初始化几个字符串以查看其中是否有十六进制字符.

假设性能没有差异,第二个解决方案是否优于第一个解决方案,还是有另一种方法来查看char是否包含十六进制值而不会使代码膨胀?

如果需要,可以在循环中将字符的大小写更改为ALLCAPS或小写(目前为ALLCAPS).

c++ string hex char conditional-statements

0
推荐指数
1
解决办法
72
查看次数

短路评估可以触发竞争条件吗?

我喜欢代码高尔夫.根据CVE-2016-5195,我想知道我的"高尔夫"代码是否能引发竞争条件.

假设我们有两个函数,它们都返回一个布尔值,我们正在初始化一个名为的布尔变量result:

result = foo() || bar();
Run Code Online (Sandbox Code Playgroud)

在理想的世界中,我们有两种情况:

  1. foo回报true.难道bar.result等于true.[短路情况]
  2. foo回报false.不要打电话bar().result等于什么bar回报.

我的问题:是否曾经有过违反短路评估的时间,并且bar尽管foo返回被调用true,或者更糟糕的bar是,在被调用之前foo被调用,可能是因为多线程?如果是这样,你能提供一段会触发这种行为的代码吗?

你的答案可能是关于这种语法有效的任何语言,尽管我认为某些语言比其他语言更严格.

c++ java security race-condition short-circuiting

0
推荐指数
1
解决办法
283
查看次数