以下代码段
int i=0;
printf("%d %d",i++,i++);
Run Code Online (Sandbox Code Playgroud)
给出输出
1 0
我可以理解,但以下
int i=0;
printf("%d %d",++i,++i);
Run Code Online (Sandbox Code Playgroud)
给出输出
2 2
有人能解释我第二种行为吗?
我看了
int c;
while(c = getchar( ) != EOF)
{
putchar(c);
}
Run Code Online (Sandbox Code Playgroud)
将打印值0或1,具体取决于下一个字符是否为EOF.因为!=的优先级高于=.
但是当我在gcc中运行这个程序时,我得到一个看起来像
| 0 0 | 的字符
| 0 1 |
当我按回车键输出.
我正在将C++实用程序移植到C#.当我在C++中运行以下语句时,我得到了正确的操作.当我在C#中运行相同的语句时,然而......

有谁知道为什么'开始++'被执行?疯狂的是,如果我在i = 0时运行(i%2)== 0,则立即窗口返回true.
我有以下内容:
string Name = name.First + " " + name.Last;
Run Code Online (Sandbox Code Playgroud)
这Tom Jones很好.
如果name.First可能为null或name.Last可能为null,我有以下内容:
string SpeakerName = name.First ?? string.Empty + " " + name.Last ?? string.Empty;
Run Code Online (Sandbox Code Playgroud)
奇怪的是它只会返回Tom.为什么这个以及如何修复它以if null使其默认为空名字符串为姓或名?
我的印象是以下容易发生泄漏
class Something {
std::unique_ptr<A> a;
std::unique_ptr<int> b{new int{3}};
std::unique_ptr<C> c;
public:
Something() : a{new A{}}, c{new C{}} {};
};
Run Code Online (Sandbox Code Playgroud)
如果评估顺序如下
new A{}new int{3}new C{}a{}b{}c{}我正在查看新的C++ 17功能(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf),该功能修复了之前评估错误的顺序C++的版本,但它似乎只谈论函数参数评估.
我查看了关于评估顺序的cppreference文档(http://en.cppreference.com/w/cpp/language/eval_order),它似乎也没有提到这一点.
以上是否有明确的评估顺序?(现在使用C++ 17或以前版本的C++)
为什么只接收一个整数?
这是代码:
#include <iostream>
int main () {
int num1,num2,num3;
std::cin>>num1,num2,num3;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 是否something <- stuff总是在Haskell中评估类似的语句,即使something在其余代码中没有调用它?(被something <- stuff称为"行动"? - 我不知道技术措辞).
如果这是真的,我还有另外一个问题.
我有一些代码从这样开始:
computeContour3d voxel voxmax level = do
voxelmax <- somefunction voxel
let max' = fromMaybe voxelmax voxmax
Run Code Online (Sandbox Code Playgroud)
也就是说,如果参数voxmax不是Nothing,则voxelmax没有必要,因为max' = fromJust voxmax在这种情况下.因此,如果我的第一个问题的回答是"是",我怎么能避免评估voxelmax何时没有必要?
monads evaluation haskell lazy-evaluation operator-precedence
我有一段(遗留)代码,我正在努力理解; 它看起来像这样:
void *a = (uint32 *)&b->c.d;
Run Code Online (Sandbox Code Playgroud)
我的问题:什么存储在一个?是吗:
我在C中寻找运算符优先级,我找不到这种优先级的文档.
比如说,在下面的测试表达式中:
int ggg9 = fggg2() + (fggg3() && fggg4() < fggg5() * fggg6());
// 4 11 6 3
Run Code Online (Sandbox Code Playgroud)
如果我们遵循运算符优先级(在表达式下面的注释行中显示),我会假设首先计算parens中的表达式,然后将结果添加到fggg2().
因此,我假设它将按此顺序解决:
int r1 = fggg5() * fggg6(); //Precedence 3 (inside parens)
int r2 = fggg4() < r1; //Precedence 6 (inside parens)
int r3 = fggg3() && r2; //Precedence 11 (inside parens)
int ggg9 = fggg2() + r3; //Outside of parens, so it's last
Run Code Online (Sandbox Code Playgroud)
但是x86-64 gcc 8.2 解决它是这样的:
(我将它转换回C++)
int i0;
int r2 = fggg2();
int …Run Code Online (Sandbox Code Playgroud) 我刚开始使用C和Pointers。关于指针的一元增量操作,有一个使我感到困惑的概念。
int num1, *pnum1
num1 = 2;
pnum1 = &num1;
printf("%d \n before: " , *pnum1);
num1 = (*pnum1)++;
printf("%d \n after: " , *pnum1);
return 0;
Run Code Online (Sandbox Code Playgroud)
由于一元增量运算符(++)的优先级高于解引用运算符(*),因此我将* pnum1放在大括号内。我期望看到以下结果:
之后:3
但是它不会增加num1的值。为什么会这样呢?是不是应该增加num1的值?