所以这更像是一个理论问题.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).
今天我的一位同事在我们的代码中发现了一个非常微妙的错误,基本上是这样的:
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#体验,我认为最好让界面更流畅并允许链接方法调用,所以不用调用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) 有没有办法避免跨类的不同构造函数进行代码复制?
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) 我正在使用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) 所以我对do/ whileloop 有一个普遍的问题.我正在学习C++,我知道你可以这样写:
do{
....
} while(a<10 && cout<<"message");
Run Code Online (Sandbox Code Playgroud)
关键是,我知道这在c ++中是可行的,但我们真的这样做吗?我的意思是," 内部的cout东西" ?
所以,在我的程序中我有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显示十六进制值.
当向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的了解并不好,所以我很好奇为什么会这样.
我正在看一些有的项目
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,是吗?
这更多是出于好奇而不是任何重要问题,但我只是想知道memmove 文档中的以下片段:
复制就像使用了中间缓冲区一样进行
(强调我的)。该公式向我表明,是否使用中间缓冲区是特定于编译器实现的。
如果您让我写memmove,我可能会自动执行以下操作:
n在堆上分配字节memcpy 温度的来源memcpy 到达目的地的温度我希望任何人都可以...
gcc——例如,它是否使用缓冲区并检查重叠,以便它可以memcpy直接;