我刚试过这段代码:
int i = 33;
int * pi = &i;
cout << "i: " << *pi << endl;
cout << "i: " << pi[0] << endl;
Run Code Online (Sandbox Code Playgroud)
两条线都返回同样的东西.
本质上,如果我得到任何指针的索引零,我将在指针的位置获得正确类型的值.与解除引用不是一回事吗?
每次在C++中取消引用指针时,不会得到索引零也有效吗?我并不是说任何人都应该这样做,但我认为它会起作用.不是吗?
我有一些代码,基本上归结为以下内容:
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路过时f到bar.也就是说,我没有使用传递,double因为if块不会运行.
此外,如果我double通过参考,一切都会好的:
void bar(bool b, double& f)
Run Code Online (Sandbox Code Playgroud)
然后我不是"使用"一个未初始化的变量,而只是指它.
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)
我的假设是正确的吗?
假设我有这个代码(不要介意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) 如果我定义如下的内容,
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) 我认为一旦函数返回,所有在其中声明的局部变量(禁止带有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) 我一直在尝试找到一种方法来重新映射我的键盘并发送5位十六进制unicode字符,这里描述的方法:ahk Send仅支持4位十六进制代码{U+nnnn},我知道在过去,autohotkey没有原生支持 unicode,因此需要一些函数才能做到这一点,也许这就是我的解决方案。
\n\n例子:
\n\n#If GetKeyState("CapsLock","T")\n+u::Send {U+1D4B0}\nRun Code Online (Sandbox Code Playgroud)\n\n结果是 \xed\x92\xb0 而不是 ,而 \xed\x92\xb0 的代码是 {U+D4B0},这意味着 AHK 只读取最后 4 位数字。即使我需要创建新功能来实现这一目标,我该如何解决它?
\n\n谢谢
\n\n-标记
\n我有一项任务,我已经坚持了太久.我应该考虑从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) 为什么可以编译由空格,制表符或"\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块吗?
我试图让"原子与非原子"概念在我的脑海中解决.我的第一个问题是我找不到"现实生活中的类比".就像原子操作上的客户/餐馆关系或类似的东西.
另外,我想了解原子操作如何将自己置于线程安全编程中.
在这篇博文中; http://preshing.com/20130618/atomic-vs-non-atomic-operations/ 它被提及为:
如果相对于其他线程在一个步骤中完成,则对共享内存执行的操作是原子操作.当对共享变量执行原子存储时,没有其他线程可以观察到修改半完成.当对共享变量执行原子加载时,它会读取单个时刻出现的整个值.非原子载荷和商店不做出这些保证.
"没有其他线程可以观察修改半完成"是什么意思?
这意味着线程将等待直到原子操作完成?该线程如何知道该操作是原子的?例如在.NET中我可以理解,如果你锁定对象,你设置一个标志来阻止其他线程.但原子怎么样?其他线程如何知道原子操作和非原子操作之间的区别?
如果上面的语句为真,那么所有原子操作都是线程安全的吗?