是否有可能在if语句中有多个一元运算符..这是给我错误的代码片段.
请在此处更正代码.
if [ -f $input_file ] -a [ -f $output_file ] -a [ -f $log_file ] ]
then
### Some Code here
fi
Run Code Online (Sandbox Code Playgroud)
谢谢Kiran
我想在函数后面应用一元'&'运算符来操作函数返回值.但是,我得到一个编译时错误(我使用MinGW的gcc)
test.c:在函数'main'中:
test.c:8:12:错误:左值作为一元'&'操作数
我制作了一个代码,让我的问题更容易理解:
int function();
void function2(int *param);
main()
{
function2(&function1());
}
int function1()
{
return 10;
}
void function2(int *param)
{
return;
}
Run Code Online (Sandbox Code Playgroud)
此代码创建相同的编译时错误.
问题是:如何在function2"()"中使用'&'运算符,而不在其他地方使用其他代码?
运算符优先级的一些信息源这样说,一元运算符一样!,~,+,-具有较高的比分配优先级=.但是,以下表达式是可能的:
!a = true # => false (with warning)
a # => true
~a = 1 # => -2
a # => 1
+a = 1 # => 1
a # => 1
-a = 1 # => -1
a # => 1
Run Code Online (Sandbox Code Playgroud)
考虑到这些结果,我能想到的唯一可能的解释是,这些一元运算符具有更低比分配优先级.如果是这种情况,则意味着我上面提到的信息是错误的.哪个是对的?有不同的解释吗?
在下面的示例中,第三个评估返回false,一切都很好,但第四个示例返回true ..
我不太明白这是如何工作的,但默认情况下Object.Equals比较两个引用以实现对象相等,并且看到as a和bboth都指向一个唯一的一个字符串的实例,这应该返回false,它在第三个例子中但不在第四个例子中.
现在我理解为什么它在第二个例子中返回true,因为.Equals()在字符串类中重写了方法,但在第四个例子中,我们将此字符串作为对象进行转换.
所以不会Object.Equals在这种情况下打电话吗?
static void Main()
{
// Create two equal but distinct strings
string a = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
string b = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
Console.WriteLine (a == b); // Returns true
Console.WriteLine (a.Equals(b)); // Returns true
// Now let's see what happens with the same tests but
// with variables of type object
object c = …Run Code Online (Sandbox Code Playgroud) 我正在研究Java前缀运算符,并遇到了这种行为
i = +--j //does not give an error
i = -++j //does not give an error
i = ---j //gives an error
i = +++j //gives an error
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
我正在阅读一些代码,我看到了一些东西
module M
def +@
self
end
end
Run Code Online (Sandbox Code Playgroud)
我很惊讶这是合法的语法,但是当我运行ruby -c文件(到lint)时,它说它是有效的.-@当我尝试*@或d@两者都是非法的时候,这也是一个合法的方法名称.我想知道什么+@意思,为什么合法?
这是我的表达式解析器使用shunting-yard算法它工作得很好,除了在一种情况下,当我使用一元减去像-2*3它不会工作(我认为它不应该因为我没有在算法中找到任何东西处理这个问题是否有一种简单的方法可以解决这个问题?(这是一个简单的解析器,我只需要()+ - */^)关心Pedram
#include <cctype>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
int olaviat (char c) {
/*************
**Operator precedence
*************/
switch(c) {
case '-' : case '+' :
return 1 ;
case '*' : case '/' :
return 2 ;
case '^' :
return 3 ;
default :
return 0 ;
}
}
double eval(char *exp) {
/*************
**Convert to reverse polish
*************/
char n [50] , o[50] ;
static int nl = 0 , …Run Code Online (Sandbox Code Playgroud) 在C中,一元加运算符称为一元算术运算符,可能不适用于指针(C标准,6.5.3.3一元算术运算符).
1一元+或 - 运算符的操作数应具有算术类型 ; 〜运算符,整数类型; 的!运算符,标量类型.
因此这个程序不会编译
#include <stdio.h>
int main(void)
{
int a = 10;
int *pa = &a;
printf( "%d\n", *+pa );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是在C++中,一元加运算符可以应用于指针(C++标准,5.3.1一元运算符)
7一元+运算符的操作数应具有算术,无范围枚举或指针类型,结果是参数的值.对整数或枚举操作数执行整体提升.结果的类型是提升的操作数的类型.
这个程序编译成功.
#include <iostream>
int main()
{
int a = 10;
int *pa = &a;
std::cout << *+pa << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
维持C和C++之间差异的原因是什么?
当我回答问题为什么int指针的大小与int数组的大小不同时,问题出现了?.我将展示如何将数组转换为sizeof运算符中的指针.
起初我想写
sizeof( +array )
Run Code Online (Sandbox Code Playgroud)
但是这个表达式在C中是无效的.所以我不得不写
sizeof( array + 0 )
Run Code Online (Sandbox Code Playgroud)
我发现C和C++之间存在这样的差异.:)
某些语言结构要求将表达式转换为布尔值.对于某些发明的临时变量(11.6),当且仅当声明格式
e正确时,表示出bool现在这样的上下文中的表达被上下文转换为并且格式良好.bool t(e);t
现在考虑下面的代码片段.它不会在clang,GCC或VS中编译.
struct A{ bool operator!() { return true; } };
int main(){
A a;
bool t(a);
}
Run Code Online (Sandbox Code Playgroud)
因此,从[CONV/4我们得出结论,类型A是不上下文转换为bool.
逻辑否定运算符的操作数在
!上下文中转换为bool(第7条);true如果转换的操作数是false,false则其值为.结果的类型是bool.
我对上面段落的理解是逻辑否定运算符的操作数!必须在上下文中转换为bool.我们刚刚结束的类型A是没有上下文转换bool.因此,从[expr.unary.op]/9,我们可以说,下面的代码应该不会编译.但它确实在铛,GCC和VS.
struct A{ bool …Run Code Online (Sandbox Code Playgroud) 继上加上运营商这个问题,我有一个跟进的问题.我们知道之间的区别plus和uplus,因而认为1+2解析3,就像1++2甚至1++++++++2.奇怪的事情发生在数组语法中,请考虑以下示例:
>> [1 ++ 2]
ans =
1 2 % Two unary plusses
>> [1 + + 2]
ans =
3 % A normal plus and a unary one
>> [1++2]
ans =
3 % A normal plus and a unary one
Run Code Online (Sandbox Code Playgroud)
同样适用于多个加号[1 +++..+++ 2],因此在中间连续生成[1 2]所有加号时,所有其他组合(据我测试)都会产生3.
据我所知,空间在MATLAB中的重要性有限; exp(3*x/y)是一样的exp( 3 * x / y ).它们在创建数组时有用:[1 …
unary-operator ×10
c++ ×3
c ×2
parsing ×2
pointers ×2
ruby ×2
arrays ×1
bash ×1
c# ×1
c++17 ×1
equality ×1
function ×1
if-statement ×1
java ×1
matlab ×1
polymorphism ×1
syntax ×1
syntax-error ×1