我有三个代码片段.这个:
1,7; //yes, that's all the code
Run Code Online (Sandbox Code Playgroud)
编译好吧.这个:
double d = (1, 7);
Run Code Online (Sandbox Code Playgroud)
也编译好了.然而这一个:
double d = 1, 7;
Run Code Online (Sandbox Code Playgroud)
无法编译.gcc-4.3.4说
错误:数字常量之前的预期unqualified-id
和Visual C++ 10说
错误C2059:语法错误:'常量'
为何如此差异?为什么不是所有三个编译都在三个,中都具有相同的效果?
我有以下内容:
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呢?
以下两个代码块完全相同并实现相同的功能吗?它在运行程序时显示相同的内容,但我要感谢一些严格的解释.
for(i=1;i<=10;i++)
{
printf("%d\n",i);
}
Run Code Online (Sandbox Code Playgroud)
和
for(i=1;i<=10;printf("%d\n",i),i++);
Run Code Online (Sandbox Code Playgroud)
该for环路期望有效C语句作为参数,不是吗?但即使我已经在StackOverflow上验证了这样的语句x+=4,y=x*2;是安全的,因为这里的逗号充当了序列点,对于在上面printf("%d\n",i),i++)的for循环中作为参数传递的语句是否相同?
如果是,请费心回答由此产生的小问题:
该comma行为是否在包含许多逗号分隔的语句中作为序列点
函数调用如下:
printf("Enter number\n"),scanf("%d",&number),printf("You entered %d",number);
int c = someIntegerValue;
// Some code...
int i;
for ( i = 0; i < 5, i < c; i++ ) {
...
}
Run Code Online (Sandbox Code Playgroud)
我的编译器说error: expression has no effect,这听起来是正确的.那么,这两个比较中的哪一个将在这里使用?我的猜测是i < c被忽略了,但我想得到其他人的一些确认,因为我还无法运行这段代码......
来自高级OOP语言C#和Java,最近开始在C中摸不着头脑.我觉得C有点奇怪,就像有人觉得JS一样.所以想澄清如下:
下面给出了错误,这看起来很直观,因为即使在OOP语言中它看起来也是不正确的语法
int i=0,1,2;
/*
Error : expected identifier or ‘(’ before numeric constant
int i = 0, 1, 2;
^
*/
Run Code Online (Sandbox Code Playgroud)
但是下面的工作令人惊讶:
int i;
i = 0,1,2; //works
Run Code Online (Sandbox Code Playgroud)
为什么会这样?保持这种行为或仅仅是一些解析技术问题是否有意义?
在完成C编程测试时,我得到了一个关于函数的预期输出的问题,该函数似乎返回两个值.其结构如下:
int multi_return_args(void)
{
return (44,66);
}
Run Code Online (Sandbox Code Playgroud)
这个问题让我感到惊讶并且固有地认为如果可能的话,第一个参数将被传递给调用者.
但在编译之后,结果是66.在快速搜索之后,我找不到任何关于构造这样的return语句的内容,所以想知道是否有些人可以帮助我.
为什么它会像这样,为什么?
我正在编写这样的代码:
#include <stdlib.h>
int main(void)
{
void *kilobyte;
kilobyte = malloc(1024);
kilobyte = NULL, free(kilobyte);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对称性,这很好.但我以前从未见过其他人使用这个成语,所以我想知道这可能实际上是不可移植/不安全的,尽管这个维基百科的引用:
在C和C++编程语言中,逗号运算符(由标记表示)是一个二元运算符,它计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(和类型).
编辑:混淆订单.现在它编译gcc没有任何警告.
我在gcc中尝试了以下代码:
#include<stdio.h>
int main()
{
int a=3,2,1;//////////////////////ERROR!//////////////////////////
printf("%d", a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望它能成功编译为:
那么,整数变量a的值应该是1吗?还是3?
当我尝试执行此程序时,为什么会出现此错误?
错误:预期标识符或'('在数字常量之前
在后C 预处理器递归宏中使用 Paul Fultz II 的解决方案,我想扩展无限数量的括号宏参数,例如
#define MY_CHAIN (alpha) (beta) (gamma)
Run Code Online (Sandbox Code Playgroud)
到一个逗号分隔的列表中,该列表可以传递给可变参数宏,例如
CHAIN_COMMA(MY_CHAIN) // alpha, beta, gamma
Run Code Online (Sandbox Code Playgroud)
在下面的示例中[alpha] [beta] [gamma],我可以扩展为大括号并使用我尝试过的所有内容分隔列表,但逗号除外alpha :: beta :: gamma。
这是我的完整(编译)代码:
#include <iostream>
using namespace std;
// unrelated macro utilities
#define SEE(expression) cout << #expression ": " << STR(expression) << endl;
#define CMD(function, ...) function(__VA_ARGS__)
#define STR(s) CMD(STR_, s)
#define STR_(s) #s
// concatenation
#define CAT(x, y) CAT_(x, y)
#define CAT_(x,y) x ## y // error from CHAIN_COMMA: passed 4 …Run Code Online (Sandbox Code Playgroud) comma-operator ×10
c ×7
c++ ×1
c99 ×1
declaration ×1
for-loop ×1
gcc ×1
operators ×1
perl ×1
symmetry ×1