小编250*_*501的帖子

在C++中,取消引用和获取索引为零会做同样的事情吗?

我刚试过这段代码:

int i = 33;
int * pi = &i;
cout << "i: " << *pi << endl;
cout << "i: " << pi[0] << endl;
Run Code Online (Sandbox Code Playgroud)

两条线都返回同样的东西.

本质上,如果我得到任何指针的索引零,我将在指针的位置获得正确类型的值.与解除引用不是一回事吗?

每次在C++中取消引用指针时,不会得到索引零也有效吗?我并不是说任何人都应该这样做,但我认为它会起作用.不是吗?

c++ pointers dereference

7
推荐指数
2
解决办法
203
查看次数

是否在函数参数列表中传递未初始化的变量?

我有一些代码,基本上归结为以下内容:

void bar(bool b, double f)
{
    if (b){
        double g = f;
    }
}

void foo()
{
    double f;
    bool b = false;
    bar(b, f);
}
Run Code Online (Sandbox Code Playgroud)

这里有任何未定义的行为吗?我怀疑有可能是因为我走的是未初始化的值复制double路过时fbar.也就是说,我没有使用传递,double因为if块不会运行.

此外,如果我double通过参考,一切都会好的:

void bar(bool b, double& f)
Run Code Online (Sandbox Code Playgroud)

然后我不是"使用"一个未初始化的变量,而只是指它.

c++ language-lawyer

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

简单赋值运算符的原子性

C11标准表示对于原子类型(_Atomic),前缀和后缀++以及--操作是原子的(6.5.2.4.,p2),复合赋值也是如此:op=(6.5.16.2,p3).

我还没有找到任何关于简单作业的文章=.它也是原子的吗?

让我们说E1,E2是int,但只有E1用说明符_Atomic定义.我的假设是:

E1 = E2;
Run Code Online (Sandbox Code Playgroud)

相当于:

atomic_store( &E1 , E2 );
Run Code Online (Sandbox Code Playgroud)

我的假设是正确的吗?

c standards atomic language-lawyer c11

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

这是内联函数的有效用法吗?

假设我有这个代码(不要介意SecondsToMinutes和MinutesToHours是彼此的副本)

inline float SecondsToMinutes(float seconds)
{
    return seconds / 60.0;
}
inline float MinutesToHours(float minutes)
{
    return minutes / 60.0;
}
inline float HoursToDays(float minutes)
{
    return minutes / 24.0;
}
inline float SeconndsToHours(float seconds)
{
    return MinutesToHours(SecondsToMinutes(seconds));
}
inline float MinutesToDays(float minutes)
{
    return HoursToDays(MinutesToHours(minutes));
}
inline float SeconndsDays(float seconds)
{
    return MinutesToDays(SecondsToMinutes(seconds));
}
Run Code Online (Sandbox Code Playgroud)

这是内联的有效用法吗?是否有意义?这是好习惯吗?毕竟,如果我没记错的话,内联意味着函数调用被函数体替换,所以

return MinutesToDays(SecondsToMinutes(seconds))
Run Code Online (Sandbox Code Playgroud)

应该相当于

return seconds / 60.0 / 60.0 / 24.0
Run Code Online (Sandbox Code Playgroud)

对?

或者为此使用宏更好吗?

#define EXCHANGE_SEC_MIN(x) (x / 60.0)
#define EXCHANGE_MIN_H(x) (x / 60.0)
#define …
Run Code Online (Sandbox Code Playgroud)

c++ macros inline function

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

当我*可以*写入字符串对象时,为什么不能写入字符串文字?

如果我定义如下的内容,

char  *s1 = "Hello";
Run Code Online (Sandbox Code Playgroud)

为什么我不能做下面这样的事情,

*s1 = 'w'; // gives segmentation fault ...why???
Run Code Online (Sandbox Code Playgroud)

如果我做下面的事情会怎么样

string s1 = "hello";
Run Code Online (Sandbox Code Playgroud)

我可以做下面这样的事情,

*s1 = 'w'; 
Run Code Online (Sandbox Code Playgroud)

c++ string stl

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

函数返回后,局部变量仍然存在

我认为一旦函数返回,所有在其中声明的局部变量(禁止带有static关键字的那些)都是垃圾收集的.但是当我尝试下面的代码时,它仍会在函数返回后打印该值.谁能解释为什么?

int *fun();
main() {
  int *p;
  p = fun();
  printf("%d",*p); //shouldn't print 5, for the variable no longer exists at this address
}
int *fun() {
  int q;
  q = 5;
  return(&q);
}
Run Code Online (Sandbox Code Playgroud)

c local-variables

5
推荐指数
3
解决办法
2748
查看次数

Autohotkey:发送 5 位十六进制 unicode 字符

我一直在尝试找到一种方法来重新映射我的键盘并发送5位十六进制unicode字符,这里描述的方法:ahk Send仅支持4位十六进制代码{U+nnnn},我知​​道在过去,autohotkey没有原生支持 unicode,因此需要一些函数才能做到这一点,也许这就是我的解决方案。

\n\n

例子:

\n\n
#If GetKeyState("CapsLock","T")\n+u::Send {U+1D4B0}\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果是 \xed\x92\xb0 而不是 ,而 \xed\x92\xb0 的代码是 {U+D4B0},这意味着 AHK 只读取最后 4 位数字。即使我需要创建新功能来实现这一目标,我该如何解决它?

\n\n

谢谢

\n\n

-标记

\n

windows unicode scripting autohotkey keyboard-shortcuts

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

递归树函数?

我有一项任务,我已经坚持了太久.我应该考虑从1到N的所有可能的表达式,如下所示:

n = 5;

1 % 2 % 3 % 4 % 5 = ?
Run Code Online (Sandbox Code Playgroud)

其中%可以是加法,减法或乘法(+, - ,*)我要做的是考虑这些操作的所有可能组合,并计算结果表达式等于n本身的数量.

因此,例如,对于n = 4,答案是1,因为只有一个表达式等于n.

1 + 2 - 3 + 4 = 4
Run Code Online (Sandbox Code Playgroud)

还有一些注意事项 - 乘法比其他两个操作更强大.所以举个例子

1 + 2 + 3 * 4 * 5 + 6 
Run Code Online (Sandbox Code Playgroud)

需要解析为

1 + 2 + (3 * 4 * 5) + 6
Run Code Online (Sandbox Code Playgroud)

此外,乘法只能用一个最大的5次连续(而不是在全部),所以任何下N = 20将能够适应整数.为了解决这个问题,我编写了这个递归树,但是在更高的值(例如n = 15)时,我的输出变得不正确.

[N ] - [Expected result] [My program's result]
[5 ] - [              3] [ …
Run Code Online (Sandbox Code Playgroud)

c tree recursion

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

字符串文字的汇编

为什么可以编译由空格,制表符或"\n"分隔的两个字符串文字而没有错误?

int main()
{
   char * a = "aaaa"  "bbbb";
} 
Run Code Online (Sandbox Code Playgroud)

"aaaa"是一个字母*"bbbb"是一个字母*

没有特定的连接规则来处理两个字符串文字.显然,以下代码在编译期间出错:

#include <iostream>
int main()
{
   char * a = "aaaa";
   char * b = "bbbb";
   std::cout << a b;
}
Run Code Online (Sandbox Code Playgroud)

这种连接是否适用于所有编译器?"aaaa"的空终止在哪里?"aaaabbbb"是一个连续的RAM块吗?

c++ compilation string-concatenation string-literals

4
推荐指数
2
解决办法
181
查看次数

原子操作会阻止其他线程吗?

我试图让"原子与非原子"概念在我的脑海中解决.我的第一个问题是我找不到"现实生活中的类比".就像原子操作上的客户/餐馆关系或类似的东西.

另外,我想了解原子操作如何将自己置于线程安全编程中.

在这篇博文中; http://preshing.com/20130618/atomic-vs-non-atomic-operations/ 它被提及为:

如果相对于其他线程在一个步骤中完成,则对共享内存执行的操作是原子操作.当对共享变量执行原子存储时,没有其他线程可以观察到修改半完成.当对共享变量执行原子加载时,它会读取单个时刻出现的整个值.非原子载荷和商店不做出这些保证.

"没有其他线程可以观察修改半完成"是什么意思?

这意味着线程将等待直到原子操作完成?该线程如何知道该操作是原子的?例如在.NET中我可以理解,如果你锁定对象,你设置一个标志来阻止其他线程.但原子怎么样?其他线程如何知道原子操作和非原子操作之间的区别?

如果上面的语句为真,那么所有原子操作都是线程安全的吗?

concurrency multithreading atomic nonatomic

4
推荐指数
2
解决办法
2638
查看次数