小编Com*_*hip的帖子

任何语言都有一元布尔切换运算符吗?

所以这更像是一个理论问题.C++和直接基于它的语言(in)(Java,C#,PHP)具有快捷运算符,用于将大多数二元运算符的结果赋值给第一个操作数,例如

a += 3;   // for a = a + 3
a *= 3;   // for a = a * 3;
a <<= 3;  // for a = a << 3;
Run Code Online (Sandbox Code Playgroud)

但是当我想切换一个布尔表达式时,我总会发现自己写的东西就像

a = !a;
Run Code Online (Sandbox Code Playgroud)

a是一个很长的表达式,这会很烦人.

this.dataSource.trackedObject.currentValue.booleanFlag =
    !this.dataSource.trackedObject.currentValue.booleanFlag;
Run Code Online (Sandbox Code Playgroud)

(是的,德米特定律,我知道).

所以我想知道,是否有任何语言都使用一元布尔切换运算符,这将允许我缩写a = !a而不重复表达式a,例如

!=a;  
// or
a!!;
Run Code Online (Sandbox Code Playgroud)

让我们假设我们的语言有一个适当的布尔类型(比如bool在C++中)并且a属于那种类型(所以没有C风格int a = TRUE).

如果你能找到一个文档化的源代码,我也有兴趣了解一下,例如C++设计者是否考虑在bool成为内置类型时添加类似的运算符,如果是这样,为什么他们决定反对它.


(注意:我知道有些人认为作业不应该使用 =,++并且+=不是有用的操作员,而是设计缺陷;让我们假设我对他们感到高兴,并专注于为什么他们不会扩展到bool).

language-agnostic bitwise-operators negation

140
推荐指数
11
解决办法
1万
查看次数

为什么字符串支持`operator =(char)`?

今天我的一位同事在我们的代码中发现了一个非常微妙的错误,基本上是这样的:

double d = 65;
std::string s = "Hello world";

// .. somewhere later, accidentally assigning to s instead of a similarly
// named numerical variable.
s = d;

// s is now 'A' 
Run Code Online (Sandbox Code Playgroud)

我发现,发生这个错误的原因是它std::basic_string<_Elem>有一个赋值运算符

_Myt& operator=(_Elem _Ch)
{ // assign 1 * _Ch
  return (assign(1, _Ch));
}
Run Code Online (Sandbox Code Playgroud)

现在编译器并没有真正抱怨(很多,如果级别足够高,它会发出关于缩小转换的警告).我们似乎很早就抓住了这个漏洞,它没有造成很大的破坏,但我想知道为什么这是允许的.毕竟,我不能写

std::string s = 65;
Run Code Online (Sandbox Code Playgroud)

因为std::string没有(n隐式)构造函数需要一个char.将它作为一种迫使你写作的明确转换会不会更安全

std::string s = string('A');
Run Code Online (Sandbox Code Playgroud)

这将禁止分配给单个_Elem(char).

这个赋值运算符是否有任何原因?正如同一位同事正确注意到的那样,

double d;
char c = d;
Run Code Online (Sandbox Code Playgroud)

是允许的

int* p = …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

18
推荐指数
1
解决办法
751
查看次数

链接时突然无法访问私有方法

我有一个简单的类层次结构,包含基类和派生类.基类有两个派生类调用的受保护成员.来自最近的一些C#体验,我认为最好让界面更流畅并允许链接方法调用,所以不用调用this->A(),那么this->B()你可以调用this->A()->B().但是,以下代码将无法编译:

#include <iostream>

class Base
{
  protected:
    Base* A()
    {
      std::cout << "A called." << std::endl;    
      return this;
    }

    Base* B()
    {
      std::cout << "B called." << std::endl;    
      return this;
    }
};

class Derived : public Base
{
  public:
    void Test()
    {
        // Base::A and Base::B are private here.
        this->A()   // This works fine
            ->B();  // Suddenly I cannot access my own private method?
    }
};

int main()
{
    Derived d;
    d.Test();

    return 0; …
Run Code Online (Sandbox Code Playgroud)

c++

11
推荐指数
1
解决办法
522
查看次数

有没有办法避免跨类的不同构造函数进行代码复制?

有没有办法避免跨类的不同构造函数进行代码复制?

class sample
{
    int a, b?
    char *c?
public:
    sample(int q) :
      a(0),
      b(0), 
      c(new char [10 * q])
    {
    }

    sample() :
      a(0),
      b(0),
      c(new char [10])
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ c++11

9
推荐指数
1
解决办法
162
查看次数

Internet Explorer中的Bootstrap输入组推送超出屏幕宽度的表

我正在使用Bootstrap构建一个网站,并且一致地设置字段的样式并指示我大量使用输入组的输入单位.有一次,我不得不在表格中创建一个编辑表格.我考虑将它放在Bootstrap网格中,但由于数据本身就是表格式的,我去做了一个table:

<table class="table table-hover">
            <thead>
                <tr>
                    <th style="width: 32px;"></th>
                    <th style="width: 7em;"></th>
                    <th style="width: 7em;">Test 1</th>
                    <th style="width: 10em;">Test 2 </th>
                    <th style="width: auto;">Test 3</th>
                    <th style="width: 10em;">Test 4
                    <th style="width: auto;">Test 5 </th>
                    <th style="width: auto;">Alternative 1</th>
                    <th style="width: 10em;">Probability 1</th>
                    <th style="width: auto;">Alternative 2</th>
                    <th style="width: 10em;">Probability 2</th>
                </tr>
            </thead>
            <tbody>
            <tr  class="shareEditor">
                <input  type="hidden" value="1" />
                <input  type="hidden" value="7" />
                <input  type="hidden" value="0" />
                <input  type="hidden" value="2" />
                <td>
                </td>
                 <td>Test</td>
                <td>
            <input  type="hidden" value="True" …
Run Code Online (Sandbox Code Playgroud)

internet-explorer-11 bootstrap-4

7
推荐指数
1
解决办法
280
查看次数

使用cout语句执行while循环

所以我对do/ whileloop 有一个普遍的问题.我正在学习C++,我知道你可以这样写:

do{
....
} while(a<10 && cout<<"message");
Run Code Online (Sandbox Code Playgroud)

关键是,我知道这在c ++中是可行的,但我们真的这样做吗?我的意思是," 内部cout东西" ?

c++ do-while

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

将RGB/Brush转换为十六进制值

所以,在我的程序中我有3个滑块,SliderRed,SliderGreen,Slider Blue.它们的最大值都是255. EndColor当我移动滑块时,控件调用正确地改变了颜色,但我还没有找到一种方法来获取hexcode.text(Textblock)将画笔或颜色转换为十六进制值,如#FF0000.

我应该用什么来工作呢?

public void SliderChanged()
{
    byte r = byte.Parse(sliderRed.Value.ToString());
    byte g = byte.Parse(sliderGreen.Value.ToString());
    byte b = byte.Parse(sliderBlue.Value.ToString());

    EndColor.Background = new SolidColorBrush(Color.FromArgb(255, r, g, b));
    hexcode.Text = EndColor.Background.ToString(); //Something like this
}
Run Code Online (Sandbox Code Playgroud)

我只需要hexcode.Text显示十六进制值.

c#

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

反转GregorianCalender对象的add minute方法

当向GregorianCalender对象添加一分钟时,我们在下面添加1分钟的时间:

GregorianCalendar gc = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
gc.add(Calendar.MINUTE,1);
Run Code Online (Sandbox Code Playgroud)

但是错误地,我把它颠倒了:

GregorianCalendar gc = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
gc.add(1,Calendar.MINUTE);
Run Code Online (Sandbox Code Playgroud)

这增加了12年的时间.任何人都可以描述为什么会这样吗?我对Java的了解并不好,所以我很好奇为什么会这样.

java datetime

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

try/catch宏后这个分号的影响是什么?

我正在看一些有的项目

    PREPAID_TRY ;
Run Code Online (Sandbox Code Playgroud)

这被定义为其他地方

#define PREPAID_TRY try {
Run Code Online (Sandbox Code Playgroud)

我认为通过使用;上面的程序员基本上取消了使用try?尝试不再生效,我是对的吗?

但是在它之下有这样的代码 - 我想知道如果try之前没有它,它是如何编译的?

PREPAID_CATCH_WITH_LOG(pErrInfo, "(Connect)") ;
Run Code Online (Sandbox Code Playgroud)

那定义为

#define PREPAID_CATCH_WITH_LOG(x,t) } \
  catch (const dErrorStruct& ex) {ex.FillErrorStruct(x);Log.LogPrintf(t ## " - %s", x->Description);} 
Run Code Online (Sandbox Code Playgroud)

为什么上面编译程序员;在第一次使用时编译try?在catch上面没有前面的try,是吗?

c++

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

/Does/ memmove 使用中间缓冲区吗?

这更多是出于好奇而不是任何重要问题,但我只是想知道memmove 文档中的以下片段:

复制就像使用了中间缓冲区一样进行

(强调我的)。该公式向我表明,是否使用中间缓冲区是特定于编译器实现的。

如果您让我写memmove,我可能会自动执行以下操作:

  • n在堆上分配字节
  • memcpy 温度的来源
  • memcpy 到达目的地的温度
  • 释放缓冲区

我希望任何人都可以...

  1. ...确认公式是否仅仅是因为用户更容易看到正在发生的事情,而不是修复特定实现实际上必须使用中间缓冲区;
  2. ...阐明了一些常见的 C++ 编译器(如或 Visual C++)中的实际实现gcc——例如,是否使用缓冲区并检查重叠,以便它可以memcpy直接;
  3. ...也许可以指出我上面的简单算法中明显的错误/低效率。

c++ internals memmove

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