是否可以通过重载参数的运算符逗号来为函数构造可变参数?我想看一个如何做的例子......,也许是这样的:
template <typename T> class ArgList {
public:
ArgList(const T& a);
ArgList<T>& operator,(const T& a,const T& b);
}
//declaration
void myFunction(ArgList<int> list);
//in use:
myFunction(1,2,3,4);
//or maybe:
myFunction(ArgList<int>(1),2,3,4);
Run Code Online (Sandbox Code Playgroud) 可能重复:
','运算符在C中做什么?
好的我今天接受了采访,他们问我下面代码的输出应该是什么
#include<stdio.h>
int main ()
{
int a=1,b=1;
char c='0';
if(a,b,c)
printf("wow \n");
}
Run Code Online (Sandbox Code Playgroud)
在我的机器上运行后,我能够得到答案,但我无法回答那里.我想知道是否允许这样的if语句?在哪里提到的?
我的问题是上面提到的if条件我无法理解if语句是如何工作的.
**更新**
我没有在K&R中找到任何这样的东西,任何人都可以推荐一本好书.我已经编程了一些东西而不是C的新东西,但是在这个问题失败之后我想再看一下如果有更深入的C概念了(特别是如上所述)提到我在哪里可以阅读.
我知道我可以像这样使用逗号运算符
for (int i = 1, j = 15; j>10; i++, j--) {
// do something neat
}
Run Code Online (Sandbox Code Playgroud)
但是有些文章似乎暗示逗号运算符可以在for循环声明之外使用,例如
int j = 2, k = 4 ;
int x ;
// Assignment statement with comma operator
x = j + 1, k ;
Run Code Online (Sandbox Code Playgroud)
来源:http://www.cs.umd.edu/~clin/MoreJava/ControlFlow/comma.html
要么
int x = (expression) ? (i++,2) : 3;
Run Code Online (Sandbox Code Playgroud)
来源:https://stackoverflow.com/a/12047433/1084813
对于代码混淆竞赛来说这将是一个巧妙的技巧或混淆我的同事,但两个示例都不会编译(Java 1.6,Eclipse Juno),错误是"赋值的左侧必须是变量".我试着查看编译器设置,看看是否可以禁止防止错误的代码,但没有运气.
怎么了?逗号运算符是旧规范的一部分,后来又改变了吗?使用不同Java设置编写这些示例的人是否允许这样做?
java for-loop variable-assignment comma-operator assignment-operator
我试图用这样的非朋友非成员函数重载逗号运算符:
#include <iostream>
using std::cout;
using std::endl;
class comma_op
{
int val;
public:
void operator,(const float &rhs)
{
cout << this->val << ", " << rhs << endl;
}
};
void operator,(const float &lhs, const comma_op &rhs)
{
cout << "Reached!\n"; // this gets printed though
rhs, lhs; // reversing this leads to a infinite recursion ;)
}
int main()
{
comma_op obj;
12.5f, obj;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
基本上,我试图让浮点数从两边使用逗号运算符.有一个成员函数只允许我写obj, float_val
,而有一个额外的帮助非朋友非成员函数允许我写float_val, obj
; 但是不会调用成员操作符函数.
GCC哭泣:
comma.cpp: In function …
Run Code Online (Sandbox Code Playgroud) 今天,我发现你可以用C++编写这样的代码并编译它:
int* ptr = new int(5, 6);
Run Code Online (Sandbox Code Playgroud)
这样做的目的是什么?我当然知道动态的new int(5)
东西,但在这里我迷失了.有线索吗?
int main()
{
int a = (1,2,3);
int b = (++a, ++a, ++a);
int c= (b++, b++, b++);
printf("%d %d %d", a,b,c);
}
Run Code Online (Sandbox Code Playgroud)
我是编程初学者.我没有得到这个程序如何显示我的输出6 9 8
.
int main()
{
switch(1,2)
{
case 1:printf("1");break;
case 2:printf("2");break;
default: printf("error");break;
}
}
Run Code Online (Sandbox Code Playgroud)
这在c中有效吗?
我认为它不应该,但是当我编译它时,它显示没有错误并产生输出2.
看std::for_each_n
的可能的实现:
template<class InputIt, class Size, class UnaryFunction>
InputIt for_each_n(InputIt first, Size n, UnaryFunction f)
{
for (Size i = 0; i < n; ++first, (void) ++i) {
f(*first);
}
return first;
}
Run Code Online (Sandbox Code Playgroud)
我注意到我们通常看到的部分i++
(或首选++i
)由两个操作组成:
++first
(void) ++i
用逗号分隔。虽然大部分都说得通,但(void)
演员阵容对我来说似乎有点令人惊讶。我只能猜测是,有可能是超载operator ,
,是以推导型的InputIt
和Size
这将导致一些令人吃惊的副作用。这可能是原因吗?如果是,我们确定演员void
阵容完全解决了这个问题吗?
标题应该能澄清我的困惑。我想用这个问题来获得全面的答案,这有助于我理解逗号运算符如何decltype
在 SFINAE 上下文中使用。我的这个问题中显示了一个示例用法。
搜索is:question [c++] [decltype] comma,可以找到以下 6 个问题:
\n(2011) How is decltype Should to work withoperator,
有一个很有前途的标题,但它是 VisualStudio 特定的,并且唯一的答案从根本上声称编译器中确实存在错误。
(2012)如何从自动返回类型推导出类型?接受的答案如下,参考表达式decltype( ( bool( fun(v[0] ) ), void() ) )
,
\n\n\n
\n- 该表达式实际上
\nbool( fun(v[0] ) )
并未被求值,因为我们处于非求值上下文中(,类似于)。这里重要的是,如果整个表达式被求值,它将被求值,因此,如果子表达式无效,则整个表达式也无效。decltype
sizeof
- \n
void()
并不是真正的值,但它的行为类似于逗号运算符和上下文中的值decltype
。
我还没有真正理解。
\n(2014) c++11 decltype …
c++ decltype sfinae comma-operator template-meta-programming
我有以下内容:
int a = 1, b = 2, c = 3, d = 4;
a = b, c = d;
printf("%d, %d, %d, %d", a, b, c, d);
Run Code Online (Sandbox Code Playgroud)
输出是:
2, 2, 4, 4
Run Code Online (Sandbox Code Playgroud)
逗号运算符如何与赋值运算符一起使用?据我所知,它会评估并返回第二个表达式,如果有的话,
(exp1, exp2)
Run Code Online (Sandbox Code Playgroud)
那么,为什么会评估a = b
呢?