考虑函数调用(调用int sum(int, int))
printf("%d", sum(a,b));
Run Code Online (Sandbox Code Playgroud)
编译器如何确定,函数调用中使用的函数sum(int, int)不是逗号运算符?
注意:我不想在函数调用中实际使用逗号运算符.我只是想知道编译器如何知道它不是逗号运算符.
通过阅读此代码,我偶然发现了以下printf()声明:
// reset, hide cursor and clear screen
printf("\e[0m\e[?25l\e[2J");
Run Code Online (Sandbox Code Playgroud)
我必须承认,我不是一名完全合格的C黑客,并且不完全理解这一点.我调整了一下,删除了论点,我理解它的作用(好吧,评论实际上说的都是这样),但我不知道它是如何完成的.此外,这是一个很难谷歌的东西.
这个printf()电话怎么样?
我正在做作业,要求我读取一个n表示循环大小的整数,然后读取一行字符n次,并在用户输入后立即打印.所以我使用scanf然后我用它打印printf.问题是,如果用户的输入只是一个换行符,它应该打印另一个\n,但scanf似乎忽略输入的单个\n.
有没有办法让这个任务scanf或我应该尝试别的吗?
int i;
scanf("%d", &i);
for(int ct=0; ct<i; ct++)
{
char buff[28];
scanf("%s", buff); // if I just press enter here
prtinf("%s\n", buff); // then I must get \n\n here
}
Run Code Online (Sandbox Code Playgroud) 该睡理发问题是一个经典的同步问题,很多人可能很熟悉,或者至少听说过.
它基于这样一个前提:当等候室(信号量)中没有客户(每个客户都是线程)时,理发师(线程)会睡觉.如果有人,他会削减他的头发(象征着一些处理)并且顾客离开.如果,等候室里没有人,那么理发师会去睡觉.当另一位顾客到达时,他必须叫醒理发师.
我使用以下基本思想实现了这一点
(虽然实际代码是在C,但为了解决问题,我编写了下面的伪代码而没有太多关心语法,只使用sem_wait和sem_post1来更顺畅地阅读)
Semaphore Customers = 0;
Semaphore Barber = 0;
Mutex accessSeats = 1;
int NumberOfFreeSeats = N;
Barber {
while(1) {
sem_wait(Customers); // waits for a customer (sleeps)
sem_wait(accessSeats); // mutex to protect the number of available seats
NumberOfFreeSeats++; // a chair gets free
sem_post(Barber); // bring customer for haircut
sem_post(accessSeats); // release the mutex on the chair
// barber …Run Code Online (Sandbox Code Playgroud) 我得到了一些使用OpenMP进行并行化的代码,并且在各种函数调用中,我注意到这个for循环对计算时间有一些好的负罪感.
double U[n][n];
double L[n][n];
double Aprime[n][n];
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
if (j <= i) {
double s;
s=0;
for(k=0; k<j; k++) {
s += L[j][k] * U[k][i];
}
U[j][i] = Aprime[j][i] - s;
} else if (j >= i) {
double s;
s=0;
for(k=0; k<i; k++) {
s += L[j][k] * U[k][i];
}
L[j][i] = (Aprime[j][i] - s) / U[i][i];
}
}
Run Code Online (Sandbox Code Playgroud)
然而,在尝试并行化并在这里和那里应用一些信号量之后(没有运气),我开始认识到else if条件对早期的强烈依赖if(L[j][i]是一个处理过的数字U[i][i],可能在早期设置if …
今天我在阅读一些代码时,偶然发现了这样的事情:
int v[5] = {1, 13, 17, 20, 16};
for_each(begin(v), end(v), [](int n){ cout << n << endl; });
Run Code Online (Sandbox Code Playgroud)
我有点理解发生了什么.它使用std :: for_each函数打印数组v []的所有值.但是处理的是[](int n){ cout << n << endl; }什么?
当我在阅读Conway的生命游戏的一些Javascript源代码(这里)时,我偶然发现了一些我以前从未见过的东西(好吧,我在三周前开始使用Javascript.为了上下文,我是来自C++背景,我正在使用专业JavaScript for Web Developers作为尝试理解JS的指南)
这是情况(小提琴):
var Obj = {
canvas: {
context : null,
init : function() {
this.canvas = document.getElementById('canvas');
this.canvas.width = 50;
this.context = this.canvas.getContext('2d');
/* ... */
}
}
}
Obj.canvas.init();
Run Code Online (Sandbox Code Playgroud)
我确实理解这是一个具有嵌套对象文字属性的对象文字.我不明白的是这 this.canvas = document.getElementById('canvas');部分.我以为我需要声明一个变量,例如context上面声明的变量,以获取canvas元素.
这显然有效,正如小提琴上所述,然而,发生了什么?更确切地说,通过使canvas成为HTML元素对象,为什么我不会丢失所有其他属性,例如context?
我有以下代码:
#include <iostream>
using namespace std;
class Test {
public:
static Test& get() {
static Test testSing;
return testSing;
}
};
int main() {
Test a = Test::get();
Test b = Test::get();
cout << &a << endl;
cout << &b << endl;
}
Run Code Online (Sandbox Code Playgroud)
我认为a并且b应该有相同的地址,因为我认为它们应该只构造一次.但是,我在此测试中获得了不同的memmory地址.
我缺少一些微不足道的东西吗?他们不应该有相同的地址吗?