考虑以下(错误)C++代码:
#include <cmath>
#include <cstdlib>
#include <iostream>
int main() {
if (abs(-0.75) != 0.75) {
std::cout << "Math is broken!\n";
return 1;
} else {
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码是错误的,因为它调用abs
(含义::abs
)而不是std::abs
.取决于实现,::abs
可能不存在,或者它可能是C abs
,或者它可能是包含版本的重载集double
,如std::abs
is.
在Linux上使用Clang,至少在我的环境中,它被证明是第二种选择:C abs
.这引发了两个警告,即使没有明确启用任何警告:
<source>:7:9: warning: using integer absolute value function 'abs' when argument is of floating point type [-Wabsolute-value]
if (abs(-0.75) != 0.75) {
^
<source>:7:9: note: use function 'std::abs' instead
if (abs(-0.75) != 0.75) { …
Run Code Online (Sandbox Code Playgroud) 在.NET
(至少在2008版本中,也许在2005年也是如此),改变a的BackColor
属性DateTimePicker
对外观完全没有影响.如何更改文本区域的背景颜色,而不是下拉日历的背景颜色?
编辑:我说的是Windows表单,而不是ASP.
一个普通的类很容易复制,并且有一个简单的默认构造函数(一个普通的类型是其中之一或类似工作的内置类).
由于可以使用memcpy
复制琐碎类型的对象,并且由于缺省初始化琐碎类型不会改变任何在representation¹字节的,将执行以下操作的代码(使用C++ 20概念)正确地初始化passed-的副本在对象?
#include <cstdlib>
#include <cstring>
#include <new>
#include <type_traits>
template <typename T>
T* copy_trivial(T orig) requires std::is_trivial_v<T>
{
void* buf = std::aligned_alloc(alignof(T), sizeof(T));
// Note the order of these statements
std::memcpy(buf, &orig, sizeof(T));
return new(buf) T;
}
Run Code Online (Sandbox Code Playgroud)
(编译器资源管理器,提供了几个实例)
看起来这个代码可以工作,因为会有一个具有正确对象表示的初始化对象.但是,鉴于初始化后没有任何反应,对象是否会有一个不确定的值 ²?
¹未在单个位置指定,但默认初始化的链接过程调用构造函数,必须隐式定义构造函数 ; 隐式定义的构造函数default-initialize所有成员和基础 ; 并且对于内置的普通类型,在没有初始化的情况下递归到底.
² [expr.new] p18.1中的注释表示它会,但注释是非规范性的,只有非放置的情况才是合理的new
.
I\xca\xbcm 尝试读取 JSON 流,其中一部分看起来像
\n "data": [\n "c1a8f800a4393e0cacd05a5bc60ae3e0",\n "bbac4013c1ca3482155b584d35dac185",\n "685f237d4fcbd191c981b94ef6986cde",\n "a08898e81f1ddb6612aa12641b856aa9"\n ]\n
Run Code Online (Sandbox Code Playgroud)\n(列表中有更多条目data
,每个条目都更长,但这应该是说明性的;列表的长度和每个十六进制字符串的长度在编译时都是已知的)
理想情况下,我\xca\xbcd想要一个单一的[u8; 64]
(实际大小在编译时已知),或者失败,a Vec<u8>
,但我想\xca\xbcs更容易将其反序列化为aVec<[u8; 16]>
并稍后合并它们。然而,我\xca\xbcm 甚至连这一点都遇到困难。
该hex
板条箱有一种方法将单个十六进制字符串反序列化为 aVec
或 的数组u8
,但我可以\xca\xbct 弄清楚如何告诉 Serde 对列表的每个条目执行此操作。有没有一种简单的方法可以让 I\xca\xbcm 忽略,或者我需要编写自己的列表反序列化器?
我想知道是否可以将指向 char 的指针直接分配给字符串文字,而无需先将字符串文字分配给左值指针。通常,如果参数采用指向某个对象的指针,则可以使用 & 传递对象的地址,并且字符串文字似乎是(或至少衰减为) char 指针,因为您可以将它们分配给 char 指针。这就是为什么我期望以下其中一项能够发挥作用:
const char ** ppchar = &"StringLiteral"; // This doesn't compile
const char ** ppchar = (const char **)&"StringLiteral"; // This compiles, but...
std::cout << *ppchar; // Throws an exception
Run Code Online (Sandbox Code Playgroud)
我预计至少其中第二个可以工作,因为在我看来“StringLiteral”至少会衰减为指针,因此:
const char** ppchar = (const char**) &"StringLiteral";
Run Code Online (Sandbox Code Playgroud)
第一个指针将指向字符串文字的地址。如果首先将字符串文字分配给左值指针,则第一个指针将指向第二个指针,该指针本质上保存着其地址。对我来说似乎是一样的。
编辑:另外,我似乎可以这样做:
const char * _pptr = (const char*)&"StringLiteral";
std::cout << _pptr; // Prints "Hello"
Run Code Online (Sandbox Code Playgroud)
因此,似乎没有禁止直接分配给字符串文字的规则。
编辑:正如对许多人来说显而易见的那样,我的间接级别是错误的。来自莫斯科的弗拉德在他的回答中解释了这一点。在:
const char ** pptr = (const char**)&"StringLiteral";
Run Code Online (Sandbox Code Playgroud)
编译器期望 pptr 指向存储字符地址的内容,而我已将其分配给“StringLiteral”本身的地址,这意味着当我 cout 时,它会取消引用第一个指针以查找哪个地址找到该字符。问题是它直接指向“StringLiteral”的地址,这意味着它使用“StringLiteral”的第一个字母的值作为要查找字符的地址,基本上它会使用“S”作为地址要去。讨厌这么厚。
我有一个带有假日名称的数据框。我有一个问题,在某些日子里,假期是在不同的日子里观察到的,有时是在另一个假期的那一天。以下是一些示例问题:
1 "Independence Day (Observed)"
2 "Christmas Eve, Christmas Day (Observed)"
3 "New Year's Eve, New Year's Day (Observed)"
4 "Martin Luther King, Jr. Day"
Run Code Online (Sandbox Code Playgroud)
我想将所有 ' (Observed)' 替换为 '' 以及仅当匹配 ' (Observed)' 时逗号前的所有内容。输出应该是:
1 "Independence Day"
2 "Christmas Day"
3 "New Year's Day"
4 "Martin Luther King, Jr. Day"
Run Code Online (Sandbox Code Playgroud)
我能够独立完成这两项工作:
(foo['holiday']
.replace(to_replace=' \(Observed\)', value='', regex=True)
.replace(to_replace='.+, ', value='', regex=True))
Run Code Online (Sandbox Code Playgroud)
但这给“小马丁·路德·金”带来了问题。